【问题标题】:How to manage migrations in Flask with Docker Compose?如何使用 Docker Compose 在 Flask 中管理迁移?
【发布时间】:2019-08-19 11:43:25
【问题描述】:

我有一个简单的 Flask 服务,它依赖于 Postgres 数据库,并且我正在使用 flask-migrate 来管理我的迁移。我知道我必须首先使用类似的方法在本地创建迁移脚本:

flask db init 
flask db migrate 

在我的web 服务Dockerfile 我在容器开始使用时发出flask db upgrade

CMD flask db upgrade && flask run

我的docker-compose.yaml 是:

web:
    build:
      context: .
    expose:
      - "5000"
    depends_on:
      - db 

db:
  image: postgres
  volumes:
    - my_volume:/var/lib/postgresql/data
  ports:
    - "5432:5432"
  environment:
    POSTGRES_PASSWORD: 123456

对我来说唯一的要求是 migrate 不应该是自动化的(请参阅下面的注释),我尝试从主机运行它,但这不可能,因为数据库在容器上运行,这样做会引发以下错误:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "<Database Container name>" to address: Name or service not known

如何克服呢?我应该遵循什么机制来管理 docker 的迁移?

注意: Flask-migrate 表明迁移脚本需要在提交之前进行审查(所以我认为迁移的创建不能自动化):

迁移脚本需要审核和编辑,如 Alembic 目前无法检测到您对模型所做的每一项更改。在 特别是,Alembic 目前无法检测表名更改, 列名更改,或匿名命名的约束。

【问题讨论】:

    标签: python docker flask flask-migrate


    【解决方案1】:

    我在flask_migrate上开了一个issue,我会引用@miguelgrinberg(所有者)的回答:

    您有三个选择:

    1. 使数据库对主机可用,以便您可以进行迁移。它不需要是您的容器化数据库,它可以 成为您仅用于迁移的镜像。
    2. 使您在其中运行迁移命令的容器可以访问源代码作为已安装的卷。
    3. 我假设您的数据库文件在您的主机中,对吗?然后,您可以使用以下副本在主机中启动单独的数据库进程 挂载在数据库容器上的文件,那么你有一个 无需容器即可迁移的本地数据库。

    选项 1 需要一些棘手的数据库设置。选项 2 需要一些 棘手的容器设置。选项 3 有点深奥,也可能 设置起来很棘手。

    然后我问他为什么这个普通的任务很难完成,他说:

    让您难以选择的开发环境是 所有东西都锁在容器里。我认为你需要做一个 开发和生产的区别。在一个发展 机器你应该更开放一些,例如导出 数据库端口,以便主机可以看到。

    【讨论】:

      【解决方案2】:

      您可以使用现有容器来初始化迁移并使用 docker exec 之类的内容生成修订文件。迁移目录必须是您放入最终 compose 容器中的代码的一部分。然后使用upgrade 作为您所说的启动容器的一部分。

      【讨论】:

      • 你的意思是我应该将我的应用目录绑定到容器,并在运行的容器中执行初始化和迁移?
      • 在启动容器之前无法运行(init),另一方面,如果在容器内发出 initi 和迁移(使用 exec),这也是不可能的,因为升级命令将需要迁移文件夹预先存在。
      • 是的,您将应用目录挂载到容器中,执行 init 和/或迁移以生成文件,这些文件将进入迁移文件夹下的应用目录。然后像使用 flask db upgrade &amp;&amp; flask run 一样开始您的撰写设置
      • 创建迁移“需要”-> 容器运行“运行”-> 烧瓶升级“需要”-> 创建迁移。所以这行不通。
      • 也许我没有很好地解释它,我的意思是使用一个不同的容器,该容器安装了代码但不运行烧瓶。您使用exec 甚至exec -it bash 进入该容器以初始化并生成迁移。
      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 2018-12-07
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2022-01-16
      相关资源
      最近更新 更多