[英]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"))” .
這有點神秘,因為數據庫文件已經連接到:我有幾個假設:
關於可能發生的事情有什么建議嗎?
編輯:只是為了增加謎團:我寫了一個快速的 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.