簡體   English   中英

線程:無法在 docker 中使用 sqlite3 打開數據庫文件

[英]Threads: unable to open database file with sqlite3 inside docker

我正在使用由 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 )。

與其只掛載文件,不如掛載它所在的目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM