首页 > 解决方案 > Django Docker 如何只在容器中迁移?

问题描述

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

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

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

所以我的问题是,如果我想在我的应用程序的迁移版本上测试一个功能,我可以在 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:

标签: pythondjangodocker

解决方案


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

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

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:

有关更多信息,您可以参考这里


推荐阅读