我不知道这是否可以被视为一个重复,因为这是一个具体案件的问题。
openjdk:slim 作为基本映像,我不想安装任何附加的依赖项,我选择了这样的工具来弥补缺少 lsof ps ,或其他用于检查进程是否正在运行,方法是将启动的进程pid写入一个文件,该文件将用于验证该进程是否存在于路径下 /proc/pid/status
openjdk:slim
lsof
ps
/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
存储库的链接: https://github.com/thcp/jenkins-agent-dod
如果容器中的主进程死亡,您应该让容器随之死亡。
docker run --restart 基本Docker CLI的选项和等效的Docker Compose选项,以及在一些退避之后重新启动垂死的容器是Kubernetes pods的默认行为。
docker run --restart
因此,如果你只是让一个容器自己死掉,你将有现成的支持容器引擎重启自己,而不添加任何特殊的支持到你的形象;只要设定 CMD 你需要容器去做的事情。这种方法还有一个好处,即如果您检测到您的环境变得不稳定(我依赖于一个数据库,它无法访问),那么进程可以选择中止自己,并在环境有希望得到改善时让它稍后重新启动。
CMD