如何在Django里面迁移数据库Docker
How to migrate database in Django inside Docker
我有一个 docker-compose 项目,其中包含两个容器 运行ning NGINX 和 gunicorn 以及我的 django 文件。
我在 AWS RDS 的 docker 之外还有一个数据库。
我的问题类似于 。但是,该问题与 docker-compose 中的数据库有关。我的在外面。
所以,如果我要为我的容器打开一个 bash 终端并且 运行 py manage.py makemigrations
问题将是 django 项目中的迁移文件,例如:/my-django-project/my-app/migrations/001-xxx.py
将与存储已应用迁移的数据库不同步。这是会发生的,因为我的容器可以随时关闭并打开一个新容器。并且不会保存迁移文件。
我的想法是:
在 docker compose 中使用 volume
,但是由于 migrations 文件夹分布在所有可能难以实现的 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
问题归结为我将 Django 在 py manage.py makemigrations
和 when/where 上生成的迁移文件存储在何处,我将 运行 py manage.py migrate
。正如 404pio 所建议的那样,您可以像 GitHub.
一样将它们简单地存储在您的代码仓库中
所以我的工作流程是这样的:
- 在我的本地开发环境中,运行
py manage.py makemigrations
和 py manage.py migrations
,(目标是像 sqlite 这样的开发数据库)。
- 如果一切正常,提交并推送到 git。
- (我正在使用 CircleCI 来测试和部署我的 Django 项目,但这也可以手动完成。)CircleCI 运行s 管道在 git 推送之后。在管道中,我将 运行
py manage.py migrate
作为最后一步。这必须在部署应用程序之后进行,因为这可能会失败,然后您不想迁移。
我有一个 docker-compose 项目,其中包含两个容器 运行ning NGINX 和 gunicorn 以及我的 django 文件。
我在 AWS RDS 的 docker 之外还有一个数据库。
我的问题类似于
所以,如果我要为我的容器打开一个 bash 终端并且 运行 py manage.py makemigrations
问题将是 django 项目中的迁移文件,例如:/my-django-project/my-app/migrations/001-xxx.py
将与存储已应用迁移的数据库不同步。这是会发生的,因为我的容器可以随时关闭并打开一个新容器。并且不会保存迁移文件。
我的想法是:
在 docker compose 中使用
volume
,但是由于 migrations 文件夹分布在所有可能难以实现的 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
问题归结为我将 Django 在 py manage.py makemigrations
和 when/where 上生成的迁移文件存储在何处,我将 运行 py manage.py migrate
。正如 404pio 所建议的那样,您可以像 GitHub.
所以我的工作流程是这样的:
- 在我的本地开发环境中,运行
py manage.py makemigrations
和py manage.py migrations
,(目标是像 sqlite 这样的开发数据库)。 - 如果一切正常,提交并推送到 git。
- (我正在使用 CircleCI 来测试和部署我的 Django 项目,但这也可以手动完成。)CircleCI 运行s 管道在 git 推送之后。在管道中,我将 运行
py manage.py migrate
作为最后一步。这必须在部署应用程序之后进行,因为这可能会失败,然后您不想迁移。