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

如何让容器持续运行?旧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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:32:53