我不知道这是否可以被认为是一个重复,因为这是一个特定的案件的问题。
目前,我已经创建了一个用于处理我的Jenkins代理的外部对接程序,它将执行自动重新启动,而无需使用主管作为解决方案(缺少python3.7支持),因此,由于我使用openjdk:slim作为基本映像,而且我不想安装任何额外的依赖项,因此我选择安装任何其他依赖项,以弥补缺少像lsof和ps这样的工具,或者其他用于检查进程是否运行的工具,方法是将已启动的进程pid写入文件中,用于验证进程是否存在于path /proc/pid/status下。目前,这是可行的,也是创建此解决方案以处理代理自动启动的主要原因。
但我的问题是,这是最好的方法还是更恰当的方法?
请查找以下代码及其实现:
#!/bin/bash
set -e
agent_runner() {
while :
do
if [ ! -f "/proc/$(cat /tmp/agent.pid)/status" ]
then
curl $JNLP_AGENT_DOWNLOAD_URL -o agent.jar
java \
-Dorg.jenkinsci.plugins.durabletask.BourneShellScript.HEARTBEAT_CHECK_INTERVAL=300 \
-Dhttps.protocols=TLSv1.2 \
-jar agent.jar \
-jnlpUrl $JNLP_AGENT_URL \
-secret $JENKINS_SECRET \
-workDir "$JENKINS_WORKDIR" &
echo $! > /tmp/agent.pid
else
:
fi
sleep 10
done
}
while :
do
if [ cat < /dev/tcp/"$TARGET" ]; then
echo "Starting Agent"
agent_runner
else
echo "Jenkins master is offline, waiting...."
fi
sleep 10
done发布于 2018-10-31 15:35:02
如果容器中的主进程死了,您应该让容器与它一起死掉。
Docker和上面的各个层都有重新启动整个容器的功能。基本Docker有一个docker run --restart选项,而等效的Docker选项,在退避之后重新启动死亡容器是Kubernetes吊舱的默认行为。
因此,如果您只是让一个容器自己死掉,您将有开箱即用的支持来重新启动容器引擎,而不需要在映像中添加任何特殊的支持;只需将CMD设置为您实际需要容器做的事情。这种方法的好处还在于,如果您检测到您的环境变得不稳定(“我依赖于数据库,它是不可访问的”),则进程可以选择中止自身,并让它在希望环境得到改善时稍后重新启动。
https://stackoverflow.com/questions/53082503
复制相似问题