基于现有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 psapi_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
相关产品推荐
相关产品推荐

