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

问题描述 投票:62回答:5

我已经在Django Quick Start instructions on the Docker site之后设置了一个Docker Django / PostgreSQL应用程序。

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

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

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

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

我仍然试图让我的头围绕Docker,并且有很多我不明白它是如何工作的,但是这个让我疯狂。为什么不迁移看到我的更改?我究竟做错了什么?

django docker docker-compose
5个回答
60
投票

您只需登录正在运行的docker容器并运行命令即可。

  1. 建立你的堆栈: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 app的CONTAINER ID并登录:
docker exec -t -i 66175bfd6ae6 bash
  1. 现在您已登录,然后转到右侧文件夹:cd path/to/django_app
  2. 现在,每次编辑模型时,都要在容器中运行:python manage.py makemigrationspython manage.py migrate

我还建议您使用docker-entrypoint为您的django docker容器文件自动运行:

  • collectstatic
  • 迁移
  • 运行服务器或用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

35
投票

我用这些方法:

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
    depends_on:
      - db

使用我们制作的docker层次结构,服务迁移在设置数据库之后运行,然后运行主服务。现在,当您运行服务时,docker将在运行服务器之前运行迁移;看看migration服务器应用于与Web服务器相同的映像,这意味着所有迁移都将从您的项目中获取,从而避免出现问题。

你可以通过这种方式避免使用入口点或其他任何东西。


15
投票

线程有点旧。但到目前为止还没有列出另一种方法。

让你的堆栈运行,然后启动一次性docker-compose运行命令。例如

#assume django in container named web
docker-compose run web python3 manage.py migrate

https://docs.docker.com/compose/reference/run/


1
投票

您可以使用docker exec命令

docker exec -it container_id python manage.py migrate

0
投票

我知道这是旧的,也许我在这里遗漏了一些东西(如果是这样,请赐教我!),但为什么不把命令添加到你的start.sh脚本中,由Docker运行来启动你的实例?它只需要几秒钟。

注:我设置DJANGO_SETTINGS_MODULE变量以确保使用正确的数据库,因为我使用不同的数据库进行开发和生产(虽然我知道这不是'最佳实践')。

这解决了我:

#!/bin/bash
# Migrate the database first
echo "Migrating the database before starting the server"
export DJANGO_SETTINGS_MODULE="edatool.settings.production"
python manage.py makemigrations
python manage.py migrate
# Start Gunicorn processes
echo "Starting Gunicorn."
exec gunicorn edatool.wsgi:application \
    --bind 0.0.0.0:8000 \
    --workers 3
© www.soinside.com 2019 - 2024. All rights reserved.