我使用的是由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.db
、database.db-wal
或database.db-journal
(。
与其只挂载文件,不如挂载它所在的目录。