Docker:在映像构建上创建数据库架构不起作用

时间:2019-07-04 17:58:47

标签: docker docker-compose

这就是我想要做的:

我正在构建一个连接到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文件为空。

编辑#2

我还注意到创建的.data目录归root所有。

如果我停止容器并将其所有者更改为我的用户,然后再次启动它,一切都会按预期进行。

0 个答案:

没有答案