如何在D中运行flask_migrate

2024-05-05 03:41:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,结构如下:

proj
  src
    application
      app.py
      manage.py
      migrations
  Dockerfile
  docker-compose.yaml

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

^{pr2}$

Dockerfile文件

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"]

码头工人-合成.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

我怎么能做到呢?在


Tags: composedockerpydockerfilesrctxtaddapp
3条回答

我将添加一个bash脚本,其中包含启动期间要运行的命令,并将其用作映像中的默认入口点。通常最好将此脚本称为entrypoint.sh

#!/usr/bin/env bash
python manage.py db upgrade
flask run  host=0.0.0.0

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

^{pr2}$

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

^{3}$

为这个任务使用第三个容器怎么样?据我所知,它只需要执行一次,所以将它添加到入口点可能不是最好的做法,除非您有一些检查来避免每次容器启动时都运行它,即使它不会造成伤害,这是一个不必要的过程。在

使用第三个容器将执行以下操作:

当您运行docker-compose up时,它将根据您想要的顺序启动,然后运行命令,然后退出。关于路径,您可以在实际应用程序容器和迁移任务容器之间创建一个共享命名卷。例如:

I have added a base service to avoid duplication in the docker-compose

version: "3"
services:
  base:
    build: .
    volumes:
      - .:/code
    env_file:
      - .env
    command: 'false'

  web:
    extends:
      service: base
    command: flask run  host=0.0.0.0
    links:
      - "db"
    ports:
      - "5000:5000"
    depends_on:
      - db

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

  migrations:
    extends:
      service: base
    command: python manage.py db upgrade
    depends_on:
      - db

其他注意事项:

  • links不需要,因为docker compose默认创建一个网络。在
  • expose也不需要,只要它们在同一网络中,容器就会看到彼此的端口。在
  • 您可能会面临某种竞争条件,在这种情况下,您的数据库实际上还没有准备好进行连接,而您的django应用程序试图连接到它。因此,为了解决这个问题,您需要使用wait-for-it或{},如{a1}所述

我们试试docker-合成.yml在

 -
version: "3"
services:
  web:
    links:
      - "db"
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    entrypoint:
      - python
      - manage.py
      - db
      - upgrade
    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

相关问题 更多 >