Docker: создание схемы базы данных при сборке образа не работает - PullRequest
0 голосов
/ 04 июля 2019

Вот что я пытаюсь сделать:

Я создаю простое приложение 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.

Если я остановлю контейнер и изменит его владельца на моего пользователя, а затем снова запущу его, все будет работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...