簡體   English   中英

為什么 sqlite(只讀)可以在 Docker 本地運行,但不能在 Google Cloud Run 中運行?

[英]Why does sqlite (read-only) work running in Docker locally but not in Google Cloud Run?

我有一個大量的 sqlite 數據庫文件(約 200 萬行),我在 Rust 應用程序中使用 Google Cloud Run 上的 rusqlite 進行查詢,使用 Z786D348E95448121DC5B7387E22E4F 的捆綁版本。

我不添加或寫入數據,並以只讀模式打開數據庫連接。 在本地運行 Docker 中的容器,查詢工作完美。 在 Cloud Run 中,數據庫已成功連接,但嘗試准備查詢時出現“錯誤准備搜索語句:SqliteFailure(Error { code: NotADatabase, extended_code: 26 }, Some("file is not a database"))” .

這有點神秘,因為數據庫文件已經連接到:我有幾個假設:

  1. 與缺少 memory 或試圖寫入 Cloud Run 的只讀文件系統有關嗎? 但是,在 Docker 中運行 256mb 的 memory 並啟用只讀模式仍然有效。
  2. gvisor 阻止了系統調用? 在 docker 中運行 strace 沒有顯示任何問題,並且沒有不受支持的系統調用日志。

關於可能發生的事情有什么建議嗎?

編輯:只是為了增加謎團:我寫了一個快速的 Flask 應用程序來使用 Python 內置的 sqlite 做同樣的事情,並得到同樣的錯誤......

編輯 2:使用單行而不是 200 萬行的數據庫,一切都按預期工作。

原始數據庫大小約為 435MB。

為了有一個最小可重現的例子,Python 版本只是接收一個請求,打開一個連接,然后查詢:

@app.route('/detail/<int:rowid>/', methods=["GET"])
def get_individual_address(rowid):
    conn = sqlite3.connect(DB_NAME)
    cur = conn.cursor()
    cur.execute("""SELECT 
                postcode,
                town_city_or_rural_location,
                suburb,
                line_one
            FROM addresses WHERE id = ?""", (rowid,))
    if result := cur.fetchone():
        conn.close()
        return {
            "postcode": result[0],
            "town_city_or_rural_location": result[1],
            "suburb": result[2],
            "line_one": result[3]
        }
    else:
        conn.close()
        abort(404)

同樣,仍然重現問題的簡化 Dockerfile 如下:

FROM python:3.9-slim-buster
COPY requirements.txt /
RUN pip install -r requirements.txt
COPY . /app
EXPOSE 8080
ENV PORT 8080
WORKDIR /app
CMD exec gunicorn --bind :$PORT address_lookup:app --workers 1 --threads 1 --timeout 60

可能是由於運行容器的用戶造成的嗎? 在雲中運行容器的用戶可能無法訪問 .sqlite 文件。

暫無
暫無

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

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