如何在 Docker 中运行 flask_migrate

mas*_*lak 5 python flask docker flask-migrate

我有一个具有以下结构的项目:

proj
  src
    application
      app.py
      manage.py
      migrations
  Dockerfile
  docker-compose.yaml
Run Code Online (Sandbox Code Playgroud)

我的目标是在 docker-compose 期间从应用程序目录运行迁移以在数据库中创建表。

python manage.py db upgrade
Run Code Online (Sandbox Code Playgroud)

文件

FROM python:3.7-alpine

ADD requirements.txt /code/
WORKDIR /code

RUN apk add --no-cache postgresql-dev gcc python3 musl-dev && \
    pip3 install -r requirements.txt


ADD . /code

EXPOSE 5000
WORKDIR /code/src/application

CMD ["flask", "run", "--host=0.0.0.0"]
Run Code Online (Sandbox Code Playgroud)

docker-compose.yaml

---
version: "3"
services:
  web:
    links:
      - "db"
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    depends_on:
      - db
    env_file:
      - .env

  db:
    image: postgres:10
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=app
    ports:
      - "5432:5432"
    expose:
      - 5432

Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

pri*_*ath 8

我会添加一个 bash 脚本,其中包含您要在启动期间运行的命令,并将其用作图像中的默认入口点。通常最好的做法是调用这个脚本entrypoint.sh

#!/usr/bin/env bash
python manage.py db upgrade
flask run --host=0.0.0.0
Run Code Online (Sandbox Code Playgroud)

然后,在您的 Dockerfile 中,将最后一行替换为以下内容

RUN chmod u+x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

如果您只想在 Docker compose 中运行升级命令,那么您可以像这样在 compose 文件中覆盖它而不是更改图像中的默认入口点

  web:
    links:
      - "db"
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    depends_on:
      - db
    entrypoint: /code/entrypoint.sh
    env_file:
      - .env
Run Code Online (Sandbox Code Playgroud)