如何让容器持续运行?旧RPM包Docker化启动失败求助
问题排查与解决方案
问题原因分析
- 变量未定义导致启动命令失效:
start_up.sh中使用了$program_name变量,但脚本里没有定义该变量的值,执行/etc/init.d/"$program_name" start时,实际是执行/etc/init.d/ start(变量为空),找不到对应的启动脚本,因此服务无法自动启动。而手动启动时你明确指定了程序名,所以能成功运行。 - 容器主进程退出导致容器停止:
start_up.sh最后执行exit 0,会让作为容器主进程的bash会话直接退出,Docker容器的生命周期与主进程绑定,主进程退出后容器就会停止,即使服务启动成功,容器也无法持续运行。
修复步骤
1. 修复启动脚本的变量与容器持续运行问题
修改start_up.sh,先定义程序名变量,同时替换exit 0为进程监控命令,保证容器持续运行:
#!/bin/bash # 定义程序名称,匹配手动启动后的进程名 program_name="mediaserver" /etc/init.d/"$program_name" start & appid=$! sleep 5 # 检查服务是否启动成功 ps aux | grep -q "$program_name" if [ $? -ne 0 ]; then echo "media app failed to start" exit 1 fi echo $appid > /opt/mediaserver/app.pid # 持续监控服务主进程,主进程不退出容器就不会停止 wait $appid
2. 优化Dockerfile启动命令(可选)
原Dockerfile的ENTRYPOINT和CMD组合可以简化,直接将启动脚本作为容器主进程,减少额外bash层:
# Dockerfile FROM centos:7 COPY mediaserver-1.0.1-12.dev7.x86_64.rpm /opt/ COPY start_up.sh /opt/ RUN yum install -y gnutls && yum install -y /opt/mediaserver-1.0.1-12.dev7.x86_64.rpm \ && rm -f /opt/mediaserver-1.0.1-12.dev7.x86_64.rpm \ && yum clean all \ && rm -rf /var/cache/yum \ && chmod +x /opt/start_up.sh WORKDIR /opt/mediaserver EXPOSE 6001 EXPOSE 17612 # 直接将启动脚本作为容器主进程 CMD ["/opt/start_up.sh"]
3. 验证修复效果
重新构建镜像:
docker build -t mediaserver-image .
启动容器:
docker run -d -p 6001:6001 -p 17612:17612 mediaserver-image
查看容器状态与进程:
docker ps docker exec <容器ID> ps aux
修改后,脚本会正确启动服务,同时通过wait $appid持续监控服务主进程,保证容器不会因为启动脚本退出而停止。如果服务进程意外退出,容器也会随之停止,便于排查问题。
内容的提问来源于stack exchange,提问作者Mayert Fran
相关产品推荐
相关产品推荐

