如何在同一Dockerfile中为DEV和PROD配置不同CMD命令?
解决方案
一、分环境配置启动命令的两种方式
方式1:构建时指定环境(生成不同镜像)
修改Dockerfile,通过构建参数区分开发/生产环境:
# 基础镜像、依赖安装等原有配置... # 设置构建参数,默认生产环境 ARG ENV=PROD # 设置工作目录,确保Python能找到项目模块 WORKDIR /app # 根据环境设置启动命令 CMD ["/bin/sh", "-c", "if [ \"$ENV\" = \"DEV\" ]; then python manage.py runserver 0.0.0.0:8000; else gunicorn --bind 0.0.0.0:8000 --workers 3 nerul.wsgi:application; fi"]
构建与运行:
- 构建开发环境镜像:
docker build --build-arg ENV=DEV -t nerul-docker:dev . - 运行开发环境(挂载本地目录实现热重载):
docker run -p 8000:8000 -v ${PWD}:/app nerul-docker:dev - 构建并运行生产环境:
docker build -t nerul-docker:prod . docker run -p 8000:8000 nerul-docker:prod
方式2:运行时指定环境(单镜像多环境)
通过启动脚本+环境变量实现,无需构建多个镜像:
- 在项目根目录创建
start.sh启动脚本:
#!/bin/sh # 确保当前目录加入Python模块搜索路径 export PYTHONPATH=/app if [ "$APP_ENV" = "DEV" ]; then python manage.py runserver 0.0.0.0:8000 else gunicorn --bind 0.0.0.0:8000 --workers 3 nerul.wsgi:application fi
- 修改Dockerfile:
# 基础镜像、依赖安装等原有配置... WORKDIR /app COPY start.sh . RUN chmod +x start.sh ENTRYPOINT ["./start.sh"]
运行:
- 开发环境(挂载目录+指定环境变量):
docker run -p 8000:8000 -v ${PWD}:/app -e APP_ENV=DEV nerul-docker - 生产环境(默认):
docker run -p 8000:8000 nerul-docker
二、挂载目录后模块找不到的原因及解决
挂载本地目录${PWD}:/app时,容器内原有的/app目录被覆盖,若本地目录未被Python识别为模块路径,就会出现ModuleNotFoundError。
解决方法:
- 在Dockerfile中设置
WORKDIR /app,确保启动命令在项目根目录执行,Python会自动将当前目录加入模块搜索路径。 - 或者在启动脚本中添加
export PYTHONPATH=/app,强制指定模块路径。
内容的提问来源于stack exchange,提问作者anjanesh
相关产品推荐
相关产品推荐

