【问题标题】:Django Docker How to only migrate in Container?Django Docker 如何只在容器中迁移?
【发布时间】:2021-04-05 16:44:14
【问题描述】:

问题可能有点不清楚,所以让我解释一下。我有一个 Django 项目,这次我想使用 Docker。所以我根据互联网上的教程对我的项目进行了docker化。

正如 Django 用户所知,如果您想扩展用户模型,您需要在之后进行迁移,您可以编辑模型

所以我正在编辑我的自定义用户模型并想为我的模型测试一个功能。我想要实现的是,在 Docker 容器上测试我的 Django 应用程序的迁移版本,如果它符合我的需要,我将在本地文件上进行迁移。但是在我运行docker-compose exec web python manage.py make migrations users 命令后,我的本地文件也发生了变化。

所以我的问题是,如果我想在我的应用程序的迁移版本上测试一个功能,我可以在 Docker 容器上测试它,然后在本地机器上迁移吗?还是我没看懂docker的逻辑?

docker-compose.yml

version: '3.8'

services:
    web:
        build: ./app
        command: python manage.py runserver 0.0.0.0:8000
        volumes: 
            - ./app/:/backend/
        ports:
            - 8000:8000
        env_file:
            - ./.env.dev
        depends_on:
            - db
    db:
        image: postgres:13-alpine
        volumes:
            - postgres_data:/var/lib/postgresql/data/
        environment:
            - POSTGRES_USER=admin
            - POSTGRES_DB=db
            - POSTGRES_PASSWORD=password
volumes:
    postgres_data:

【问题讨论】:

    标签: python django docker


    【解决方案1】:

    将 Docker 视为具有运行应用程序的现成环境的虚拟机。现在问你的问题。

    【讨论】:

    • 那么为什么这些变化发生在我的本地机器上,而不是只在虚拟环境中?
    • 可能是因为您在应用根目录中使用了卷?所以它在那里创建了迁移文件?
    • 我怎么不能在我的根目录中使用卷?这样做的方法是什么?
    • 当你想在你的容器中持久化一些文件时使用卷。确保卷映射到主机上的安全目录。
    【解决方案2】:

    如果你想在每次启动 docker 时运行 migrate,你可以这样做

    在 docker-compose.yml 所在的同一路径中创建一个文件 entrypoint.sh

    entrypint.sh 是一个 bash 文件,其中包含在运行服务器之前要运行的命令,您可以在其中添加以下代码:-

    python manage.py migrate --noinput
    

    您的docker-compose.yml 将是

    version: '3.8'
    
    services:
        web:
            build: ./app
            command: python manage.py runserver 0.0.0.0:8000
            entrypoint: /code/entrypoint.sh # path where you placed your entrypoint.sh file
            volumes: 
                - ./app/:/backend/
            ports:
                - 8000:8000
            env_file:
                - ./.env.dev
            depends_on:
                - db
        db:
            image: postgres:13-alpine
            volumes:
                - postgres_data:/var/lib/postgresql/data/
            environment:
                - POSTGRES_USER=admin
                - POSTGRES_DB=db
                - POSTGRES_PASSWORD=password
    volumes:
        postgres_data:
    

    更多信息可以参考here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2018-07-15
      相关资源
      最近更新 更多