You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于现有Docker-Compose配置,如何同时运行Django项目的Dev与Prod容器?

要同时运行Dev和Prod两个环境的Docker容器,最清晰的方式是利用Docker Compose的多文件扩展功能,把通用配置和环境专属配置分开,既能避免重复代码,又能确保两个环境的配置互不干扰。我来一步步帮你改造现有配置:


第一步:调整项目结构

先给不同环境准备独立的配置文件,建议新增这些文件:

  • docker-compose.dev.yml:Dev环境专属配置(覆盖基础配置)
  • docker-compose.prod.yml:Prod环境专属配置(覆盖基础配置)
  • env/dev.env:Dev环境的环境变量(比如DEBUG=True、测试数据库地址等)

你的项目结构会变成:

your-django-project/
├── docker-compose.yml          # 通用基础配置
├── docker-compose.dev.yml      # Dev环境专属配置
├── docker-compose.prod.yml     # Prod环境专属配置
├── env/
│   ├── main.env               # Prod环境变量
│   └── dev.env                # Dev环境变量
├── nginx/
│   └── api.conf
├── django_run.sh
└── ...(其他Django项目文件)

第二步:编写通用基础配置(docker-compose.yml)

把两个环境共用的配置放在这里,去掉环境专属的container_name、env_file、command等:

version: '2.0'
services:
  web:
    build: .
    volumes:
      - .:/usr/django/app/
    expose:
      - "8000"
  nginx:
    build: nginx
    volumes:
      - ./nginx/api.conf:/etc/nginx/conf.d/api.conf
      - .:/usr/django/app

第三步:编写Dev环境专属配置(docker-compose.dev.yml)

这里只需要写和基础配置不同的部分,比如容器名称、环境变量、启动命令、端口(避免和Prod冲突):

version: '2.0'
services:
  web:
    container_name: api_dev
    env_file: env/dev.env
    # Dev环境直接用runserver,方便热重载和调试
    command: python manage.py runserver 0.0.0.0:8000
    # 直接暴露端口,方便本地跳过nginx直接访问(可选)
    ports:
      - "8001:8000"
  nginx:
    container_name: ng_dev
    ports:
      - "8000:8000"

第四步:编写Prod环境专属配置(docker-compose.prod.yml)

把你原来的Prod专属配置移到这里:

version: '2.0'
services:
  web:
    container_name: api_prod
    env_file: env/main.env
    command: bash django_run.sh
  nginx:
    container_name: ng_prod
    ports:
      - "8000:8000"

第五步:优化Django启动脚本(django_run.sh)

让脚本根据环境变量自动切换启动方式,这样Dev和Prod都能复用:

#!/bin/bash
# 先执行迁移(可选,根据你的需求)
python manage.py migrate

# 根据DEBUG环境变量判断启动命令
if [ "$DEBUG" = "True" ]; then
    # Dev环境:用runserver,支持热重载
    python manage.py runserver 0.0.0.0:8000
else
    # Prod环境:用gunicorn/uwsgi(这里以gunicorn为例)
    gunicorn your_project.wsgi:application --bind 0.0.0.0:8000
fi

第六步:运行不同环境

现在你可以同时启动两个环境,端口不会冲突:

  • 启动Prod环境:
    docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    
  • 启动Dev环境:
    docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
    
  • 查看容器状态:
    docker ps
    
    你会看到api_prod、ng_prod、api_dev、ng_dev四个容器同时运行。

关键注意事项
  • 环境变量隔离:确保env/dev.env里设置DEBUG=True,env/main.env里设置DEBUG=False,数据库地址等配置也要区分开。
  • 端口冲突:Dev和Prod的端口要错开(比如示例中Prod用8000,Dev web用8001),避免同时运行时端口占用。
  • Django配置适配:你的Django settings.py要支持从环境变量读取配置,比如:
    import os
    DEBUG = os.environ.get('DEBUG', 'False') == 'True'
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': os.environ.get('DB_NAME'),
            'USER': os.environ.get('DB_USER'),
            'PASSWORD': os.environ.get('DB_PASSWORD'),
            'HOST': os.environ.get('DB_HOST'),
            'PORT': os.environ.get('DB_PORT'),
        }
    }
    

内容的提问来源于stack exchange,提问作者nesalexy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:39:22