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

如何在同一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:运行时指定环境(单镜像多环境)

通过启动脚本+环境变量实现,无需构建多个镜像:

  1. 在项目根目录创建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
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:41:12