我有一个与 RHEL 8 操作系统不兼容的旧 rpm 软件包。我把它做成了docker镜像,希望能以docker的方式运行。但我失败了。我不知道问题出在哪里。
Dockerfile
# 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
ENTRYPOINT ["/bin/bash","-c"]
CMD sh /opt/start_up.sh
start_up.sh
#!/bin/bash
/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
exit 0
我用
docker run -it
,可以正常进入容器,但是服务没有启动。我可以手动启动它。
我使用docker run -it,可以正常进入容器,但是服务没有启动。我可以手动启动它。
root 30512 1 0 23:52 ? 00:00:00 /opt/mediaserver/bin/SystemShell -r mediaserver:/opt/mediaserver/bin/mediaserve root 30513 30512 3 23:52 ? 00:00:00 /opt/mediaserver/bin/mediaserver -s mediaserver -m
您的
start_up.sh
需要一个变量名称$program_name
,但是,您尚未在任何地方定义它。这就是为什么使用 CMD sh /opt/start_up.sh
结果 Docker 容器在 sh
shell 处停止并等待下一个指令。
要解决此问题,您可以
$program_name
来硬编码您的初始化脚本,例如,如果媒体服务器启动脚本是 mediaserver
,则将 $program_name
替换为 mediaserver
start_up.sh
以接受输入,然后将 CMD 更新为类似 CMD sh /opt/start_up.sh mediaserver
的内容(假设程序名称为 mediaserver