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

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服务和你的业务脚本,确保两者都能稳定运行:

  1. 修改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"]
  1. 创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:17:29