线程:无法打开docker中带有sqlite3的数据库文件



我使用的是由gunicorn运行的Flask应用程序,如果我直接在服务器上运行它,它可以正常工作,但如果我在Docker内运行它并返回错误,它就会失败

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python3.8/threading.py", line 932, in _bootstrap_inner
self.run()
File "/usr/lib64/python3.8/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "/opt/app-root/src/backend.py", line 242, in runAlertManager
db = get_db()
File "/opt/app-root/src/backend.py", line 29, in get_db
db = g._database = sqlite3.connect(DATABASE)
sqlite3.OperationalError: unable to open database file

如果我在docker容器中获得了cli,我就可以在该文件上使用sqlite3客户端。如果我删除线程部分,它也可以正常工作,只是不确定为什么它可以直接工作,但不能在Docker 中工作

简化了我有这样的

from threading import Thread
from time import sleep
from flask import g, Flask, request, jsonify, current_app
app = Flask(__name__)
def get_db():
db = getattr(g, '_database', None)
if db is None:
print(DATABASE)
db = g._database = sqlite3.connect(DATABASE)
return db
def runAlertManager(app):
'''
Runs AlertManager in a separate process
'''
with app:
db = get_db()
while True:
#do something
sleep(10)
x = Thread(target=runAlertManager, args=(app.app_context(), ))
x.start()

仅指向/db/database.db的路径,该路径已装入容器并存在。

SQLite数据库所在的整个目录都需要是可写的;SQLite需要创建一些sidecar文件(例如database.dbdatabase.db-waldatabase.db-journal(。

与其只挂载文件,不如挂载它所在的目录。

最新更新