如何解决Dockerfile CMD调用的脚本中npm start命令不运行的问题
问题根因
当前启动脚本为同步串行执行逻辑,python3 -m launcher.py 会以前台阻塞进程运行,不会主动退出,因此后续的npm start语句永远不会被执行。
解决方案
方案1:轻量修改启动脚本(适合临时测试场景)
将Python应用放后台运行,把前端进程作为容器主前台进程,修改wrapper-script.sh内容如下:
#!/bin/sh # Python应用后台运行 python3 -m launcher.py & # 前端保持前台运行,避免容器退出 cd RPDC-front-end && npm start
方案2:使用supervisor进程管理(适合生产/稳定运行场景)
该方案可以实现两个进程的故障自动重启、日志统一输出,符合Docker运行规范。
- 修改Dockerfile,新增supervisor安装和配置逻辑:
# syntax=docker/dockerfile:1 FROM nikolaik/python-nodejs WORKDIR /app COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt # 安装supervisor进程管理工具 RUN apt-get update && apt-get install -y supervisor && rm -rf /var/lib/apt/lists/* COPY RPDC-front-end/package.json RPDC-front-end/package.json RUN cd RPDC-front-end && npm install COPY . . EXPOSE 1234 # 复制supervisor配置文件 COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf CMD ["/usr/bin/supervisord", "-n"]
- 在项目根目录新建
supervisord.conf配置文件:
[supervisord] nodaemon=true logfile=/dev/null logfile_maxbytes=0 [program:python-app] command=python3 -m launcher.py directory=/app autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:react-app] command=npm start directory=/app/RPDC-front-end autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0
额外注意事项
请核对前端目录名称拼写:Dockerfile中配置的目录为
RPDC-front-end,你描述手动执行时的目录为RDPC-front-end,如果存在拼写错误需要同步修正所有配置中的路径。
内容的提问来源于stack exchange,提问作者rpsutton
相关产品推荐
相关产品推荐

