这就是我想要做的:
我正在构建一个连接到SQLite的简单Flask应用。
我想在映像构建期间创建SQLite数据库架构。
由于SQLite基于常规文件而不是套接字,因此我需要进行一些检查以查看文件是否不存在,等等。
我还希望在一个环境变量中设置数据库文件的路径,稍后该变量将被应用程序用来实际运行查询。
我的.env
文件:
SQLITE_DB_FILE=/data/search_history_new.db
我的Dockerfile
:
FROM python:3.7-alpine
ARG sqlite_db_file
WORKDIR /app
RUN apk add --no-cache gcc musl-dev linux-headers sqlite
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
RUN ./setup.sh ${sqlite_db_file}
CMD ["flask", "run"]
setup.sh
文件:
#!/bin/sh
DB_FILE=${1:-'./.data/search_history.db'}
echo "Checking for the existence of database file: ${DB_FILE}"
if [ ! -f "$DB_FILE" -o ! -s "$DB_FILE" ]; then
echo "Database not initialized yet..."
echo "Creating database file..."
mkdir -p $(dirname "$DB_FILE")
touch "$DB_FILE"
echo "Done."
fi
echo "Executing database schema..."
sqlite3 "$DB_FILE" < ./search_history/database/schema.sql
echo "All set."
我的schema.sql
文件:
DROP TABLE IF EXIStS search_history;
CREATE TABLE search_history(
id VARCHAR(30) NOT NULL PRIMARY KEY,
created_at INTEGER NOT NULL DEFAULT CURRENT_TIMESTAMP,
full_address TEXT NOT NULL,
postal_code TEXT NOT NULL,
country_code TEXT NOT NULL,
latitude DECIMAL(10,7) NOT NULL,
longitude DECIMAL(10,7) NOT NULL,
temperature DECIMAL(6,2)
);
CREATE INDEX idx_postal_code_country_code on
search_history(postal_code, country_code);
CREATE INDEX idx_created_at on
search_history(created_at DESC);
我的docker-compose.yml
文件:
version: '3'
services:
server:
build:
context: .
args:
- sqlite_db_file=${SQLITE_DB_FILE}
env_file: .env
environment:
FLASK_APP: app.py
FLASK_RUN_HOST: 0.0.0.0
ports:
- "5000:5000"
volumes:
- ./.data:/app/.data
问题在于,即使正在执行创建的命令,在构建期间(docker-compose build
)仍未创建数据库文件。
启动服务器时,我注意到数据库文件已创建,但它完全是空的。
然后我尝试运行查询,出现以下错误:
{
"message": "no such table: search_history"
}
我想念什么?
我注意到以下模式:
docker-compose build
时,未创建主机.data
目录。docker-compose run
时,创建的.data
目录中的search_history.db
文件为空。我还注意到创建的.data
目录归root
所有。
如果我停止容器并将其所有者更改为我的用户,然后再次启动它,一切都会按预期进行。