Docker CMD命令未执行:GUI容器后台脚本不运行求助
问题原因
你的CMD ["/tmp/startup.sh"]让startup.sh成为容器的PID 1进程,它启动后台的procedure.sh后就立刻退出了。Docker会认为容器的主进程已结束,直接终止整个容器,导致procedure.sh还没完成sleep 5和后续操作就被杀死,所以/tmp/log.txt无法生成。而手动执行时,容器的主进程是基础镜像的VNC服务进程,不会因为你的脚本退出而终止,因此脚本能正常执行。
解决方案
方案1:让startup.sh接管基础镜像的主进程(推荐)
基础镜像dorowu/ubuntu-desktop-lxde-vnc:latest原本的CMD是启动VNC和桌面服务的脚本(通常是/startup.sh),你需要在自己的startup.sh最后执行这个原有主进程,保证容器持续运行,同时后台脚本能完成执行:
修改startup.sh:
#!/bin/bash # 启动后台业务脚本,保留日志方便排查 cd /tmp && nohup ./procedure.sh > /tmp/procedure.log 2>&1 & # 执行基础镜像的原有启动脚本,维持容器运行 exec /startup.sh
方案2:等待后台脚本完成后保持容器运行
如果不需要启动GUI服务,只是要让脚本执行完成并保持容器运行,可以修改startup.sh等待后台进程结束,再进入休眠:
#!/bin/bash cd /tmp && nohup ./procedure.sh > /tmp/procedure.log 2>&1 & # 等待后台脚本执行完毕 wait $! # 保持容器不退出 tail -f /dev/null
方案3:使用进程管理工具(进阶)
可以在Dockerfile中安装supervisord,配置它同时管理GUI服务和你的业务脚本,确保两者都能稳定运行:
- 修改Dockerfile,安装supervisord并添加配置:
FROM dorowu/ubuntu-desktop-lxde-vnc:latest WORKDIR /data COPY ./startup.sh /tmp/ COPY ./procedure.sh /tmp/ COPY supervisord.conf /etc/supervisor/conf.d/ RUN chmod +x /tmp/startup.sh /tmp/procedure.sh && \ apt-get update && apt-get install -y supervisor CMD ["supervisord", "-n"]
- 创建
supervisord.conf配置文件:
[supervisord] nodaemon=true [program:gui-service] command=/startup.sh autostart=true autorestart=true [program:procedure-script] command=/tmp/procedure.sh autostart=true autorestart=false startsecs=5
验证方法
启动容器后,进入容器查看日志:
docker exec -it <容器ID> bash # 查看业务脚本日志 cat /tmp/procedure.log # 查看是否生成目标文件 cat /tmp/log.txt
内容的提问来源于stack exchange,提问作者Itzik.B
相关产品推荐
相关产品推荐

