【问题标题】:How to migrate database in Django inside Docker如何在 Docker 内部的 Django 中迁移数据库
【发布时间】:2021-07-20 17:12:04
【问题描述】:

我有一个 docker-compose 项目,其中包含两个运行 NGINX 和 gunicorn 的容器以及我的 django 文件。 我在 AWS RDS 的 docker 之外也有一个数据库。 我的问题类似于this one。但是,这个问题与 docker-compose 中的数据库有关。我的在外面。

所以,如果我要为我的容器打开一个 bash 终端并运行 py manage.py makemigrations,问题将是 django 项目中的迁移文件,例如:/my-django-project/my-app/migrations/001-xxx.py 将与存储的数据库不同步已应用了哪些迁移。这会发生,因为我的容器可以随时关闭并打开一个新容器。并且不会保存迁移文件。

我的想法是:

  • 在 docker compose 中使用 volume,但由于迁移文件夹分布在所有可能难以实现的 django 应用程序中。

  • 在 docker 之外处理迁移,这需要某种“主”项目来存储迁移文件。这似乎不是一个好主意,因为那样整个项目将依赖于一些现有的本地文件。

我正在寻找有关如何处理迁移的良好做法的建议。

编辑:

这里是 docker-compose.yml,我在本地使用 docker-compose up 运行它,并在生产环境中使用 docker compose up 在 AWS ECS 中运行。我遗漏了一些我认为无关紧要的 aws-cloudformation 配置。

docker-compose.yml

version: '3'

services:
  web:
    image: <secret>.dkr.ecr.eu-west-3.amazonaws.com/api-v2/django:${IMAGE_TAG}
    build:
      context: .
      dockerfile: ./Dockerfile
    networks: 
      - demoapp
    environment:
      - DEBUG=${DEBUG}
      - SECRET_KEY=${SECRET_KEY}

  nginx:
    image: <secret>.dkr.ecr.eu-west-3.amazonaws.com/api-v2/nginx:${IMAGE_TAG}
    build:
      context: .
      dockerfile: ./nginx.Dockerfile
    ports:
      - 80:80
    depends_on:
      - web
    networks: 
      - demoapp

【问题讨论】:

  • 你能在没有秘密的情况下发布你的 docker-compose 文件吗?你有开发和生产环境吗?
  • 正常的工作流程是:你在你的开发环境中更改模型 -> 在你的开发环境上进行迁移 -> 在你的开发环境上迁移 -> 提交并将迁移文件推送到 repo -> 部署到生产环境-> 部署调用迁移命令。开发环境和生产环境有不同的数据库。
  • 如果你破坏数据库,你应该创建一个空的。但我认为是的
  • 非常感谢,这很有道理!
  • 最好在单独的答案中描述究竟是什么问题以及您如何解决它。你可以回答你的问题。也许您的帖子对其他人有帮助。

标签: python django docker docker-compose database-migration


【解决方案1】:

问题归结为我将存储 Django 在py manage.py makemigrations 上生成的迁移文件的位置以及我将在何时/何处运行py manage.py migrate。正如404pio 建议的那样,您可以将这些简单地存储在您的代码仓库中,例如 GitHub。

所以我的工作流程是这样的:

  1. 在我的本地开发环境中,运行 py manage.py makemigrationspy manage.py migrations,(目标是像 sqlite 这样的开发数据库)。
  2. 如果一切正常,提交并推送到 git。
  3. (我正在使用 CircleCI 来测试和部署我的 Django 项目,但这也可以手动完成。)CircleCI 在 git push 之后运行管道。在管道中,我将运行py manage.py migrate 作为最后一步。这必须在应用部署之后进行,因为这可能会失败,然后您就不想迁移了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多