如何让Docker容器持续运行?启动后退出返回码0问题解决求助
问题根因
Docker容器的生命周期与主进程(PID 1)绑定,主进程退出则容器终止。你在start.sh中将所有Python服务都放到后台运行后,脚本本身没有剩余的前台执行任务,执行完成后直接退出,作为主进程的脚本退出就会触发容器终止,退出码0代表脚本正常执行结束。
另外配置存在两处需要修正的问题:
- Dockerfile中没有给
start.sh赋予可执行权限 - CMD指令的字符串参数未加引号,不符合Dockerfile语法规范
修复步骤
1. 修改启动脚本start.sh
在脚本末尾添加wait指令,等待所有后台Python子进程运行,避免脚本执行完成后直接退出:
#!/bin/sh python source/server/main.pyc & python source/server/main_socket.pyc & python source/server/main_monitor_server.pyc & python source/server/main_status_server.pyc & python source/server/main_events_server.pyc & # 等待所有后台子进程,保持脚本作为主进程不退出 wait
2. 修正Dockerfile配置
补充启动脚本赋权指令,修正CMD语法:
FROM ubuntu:trusty RUN mkdir -p /home/server COPY server /home/server/ # 给启动脚本赋予可执行权限 RUN chmod +x /home/server/start.sh EXPOSE 8854 # 修正CMD参数的引号规范 CMD ["/home/server/start.sh"]
3. 重新构建镜像并启动服务
执行以下命令完成镜像构建和服务启动,后续服务器重启后容器会通过restart: always配置自动拉起,无需手动操作:
# 重新构建镜像,标签与原有配置保持一致 docker build -t deviceserver:latest . # 后台启动compose服务 docker-compose up -d
可选优化建议
如果需要实现单服务故障自动重启的能力,可以替换脚本最后的wait指令,改用supervisor等进程管理工具托管所有Python服务,将supervisor作为前台主进程运行即可,还能实现进程异常退出自动拉起的能力。
内容的提问来源于stack exchange,提问作者Lord M
相关产品推荐
相关产品推荐

