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

发布于 2021-02-02 22:34:28

我已经按照Docker站点上的Django Quick Start指导紧密设置了Docker Django / PostgreSQL应用程序。

第一次运行Django的manage.py migration时,使用命令sudo docker-compose run web python manage.py migrate可以正常工作。该数据库建立在Docker PostgreSQL容器内就很好了。

当我保存它们时,对Django应用本身所做的更改同样会反映在Docker Django容器中。这很棒!

但是,如果我再改在Django的模型,并尝试更新的Postgres数据库来匹配模型,都没有检测到变化所以没有迁移发生,无论我有多少次运行makemigrations或migrate试。

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

我仍在努力了解Docker,但我对它的工作原理有很多不了解,但这使我发疯。为什么不迁移看到我的更改?我究竟做错了什么?

关注者
0
被浏览
132
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    你只需要登录到正在运行的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 ...
    

    获取你的django应用程序的容器ID并登录:

    docker exec -t -i 66175bfd6ae6 bash
    

    现在你已登录,然后转到正确的文件夹: cd path/to/django_app

    现在,每次编辑模型时,都在容器中运行:python manage.py makemigrations和python manage.py migrate

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

    • collecstatic
    • migrate
    • runserver or start it with gunicorn or 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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看