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

Docker Compose服务保持运行的推荐方法咨询

解决Docker容器运行10秒后退出的问题

问题根源

你的容器之所以会退出,是因为作为容器主进程的script.sh在执行完nohup example_process和sleep 10后就结束了——Docker容器的生命周期和主进程绑定,主进程结束容器就会终止。

推荐的系统友好方案(最佳实践)

正确的做法是让启动脚本持续等待主进程example_process结束,而非用sleep或无限循环这类临时方案。这样容器会和业务进程同生命周期,进程崩溃时容器也会退出,方便后续监控和自动重启。

方案1:直接前台运行业务进程(最推荐)

修改你的script.sh,去掉nohup和sleep,让业务进程在前台运行:

#!/bin/bash
# 直接前台启动进程,Docker会将其作为容器主进程
example_process

这种方式最符合Docker的设计理念:容器就是为运行单个服务进程而生,前台运行能让Docker正确捕获信号(比如执行docker stop时发送SIGTERM给业务进程),也方便日志收集。

方案2:用wait命令等待后台进程结束

如果因为特殊需求必须用nohup将进程放到后台(比如需要忽略挂起信号),可以记录进程PID并通过wait命令等待其结束:

#!/bin/bash
# 启动进程并将日志输出到指定文件
nohup example_process > /var/log/example_process.log 2>&1 &
# 记录进程PID
PROCESS_PID=$!
# 等待进程结束,脚本会一直阻塞直到进程终止
wait $PROCESS_PID

为什么之前的尝试无效?

  • command: tail -f /dev/null:当Dockerfile中指定了ENTRYPOINT时,command的内容会作为参数传给ENTRYPOINT的脚本,而非替换主进程。所以你的script.sh会把tail -f /dev/null当作参数处理,不会改变脚本执行完就退出的结果。
  • stdin_open: true + tty: true:这只是给容器分配了终端,但你的脚本还是会执行完sleep 10后正常退出,除非脚本本身等待终端输入,因此无法解决问题。

关于无限循环的弊端

在脚本中添加while true; do sleep 3600; done虽然能让容器一直运行,但属于投机取巧:如果example_process意外崩溃,容器仍会保持存活状态,你无法及时发现业务进程的异常,违背了容器“进程即服务”的设计原则,不推荐使用。

内容的提问来源于stack exchange,提问作者tomm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:35:27