如何在使用Docker-Compose时执行Django数据库迁移?

我已经根据Docker站点上的Django快速入门指令设置了一个Docker Django / PostgreSQL应用程序。

我第一次运行Django的manage.py migrate,使用命令sudo docker-compose run web python manage.py migrate ,它按预期工作。 数据库是在Docker PostgreSQL容器内部构build的。

对Django应用程序本身进行的更改同样反映在Docker Django容器中,这一刻我就保存了它们。 这很棒!

但是,如果我在Django中更改模型,并尝试更新Postgres数据库以匹配模型,则不会检测到任何更改,因此,无论运行makemigrations或再次migrate多less次都不会发生migrate

基本上,我每次更改Django模型时,都必须删除Docker容器(使用sudo docker-compose rm ),并重新开始新的迁移。

我仍然试图让自己的头靠近Docker,而且我不明白它是如何工作的,但是这个问题让我感到非常紧张。 为什么不迁移看到我的变化? 我究竟做错了什么?

您只需login到您正在运行的Docker容器并运行您的命令。

  1. 构build你的堆栈: docker-compose build -f path/to/docker-compose.yml
  2. 启动您的堆栈: docker-compose up -f path/to/docker-compose.yml
  3. 显示docker运行容器: docker ps
 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3fcc49196a84 ex_nginx "nginx -g 'daemon off" 3 days ago Up 32 seconds 0.0.0.0:80->80/tcp, 443/tcp ex_nginx_1 66175bfd6ae6 ex_webapp "/docker-entrypoint.s" 3 days ago Up 32 seconds 0.0.0.0:32768->8000/tcp ex_webapp_1 # postgres docker container ... 
  1. 获取你的Django应用程序的CONTAINER ID并login到:
 docker exec -t -i 66175bfd6ae6 bash 
  1. 现在您已经login,然后转到正确的文件夹: cd path/to/django_app

  2. 现在,每次你编辑你的模型,运行你的容器: python manage.py makemigrationspython manage.py migrate

我也build议你为你的django docker容器文件使用docker-entrypoint自动运行:

  • collecstatic
  • 迁移
  • runserver或者用gunicorn或uWSGI启动它

这是一个例子( docker-entrypoint.sh ):

 #!/bin/bash # Collect static files echo "Collect static files" python manage.py collectstatic --noinput # Apply database migrations echo "Apply database migrations" python manage.py migrate # Start server echo "Starting server" python manage.py runserver 0.0.0.0:8000 

我使用这些方法:

 services: web: build: . image: uzman command: python manage.py runserver 0.0.0.0:8000 ports: - "3000:3000" - "8000:8000" volumes: - .:/code depends_on: - migration - db migration: image: uzman command: python manage.py migrate --noinput volumes: - .:/code 

使用我们制作的docker层次结构,服务迁移在build立数据库之后运行,之后运行主要服务。 现在,当你运行你的服务时, docker将在运行服务器之前运行迁移; 看看migration服务器是应用在与Web服务器相同的映像上,这意味着所有的迁移将从您的项目中取得,避免了问题。

你用这种方法避免了入口点或其他任何事情。