Вот что я пытаюсь сделать:
Я создаю простое приложение Flask, подключенное к SQLite.
Я хочу создать схему базы данных 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
.
Редактировать # 2
Я также заметил, что созданный каталог .data
принадлежит root
.
Если я остановлю контейнер и изменит его владельца на моего пользователя, а затем снова запущу его, все будет работать как положено.