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
相关产品推荐
相关产品推荐

