首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保持进程在容器上运行的正确方法

保持进程在容器上运行的正确方法
EN

Stack Overflow用户
提问于 2018-10-31 11:40:52
回答 1查看 52关注 0票数 0

我不知道这是否可以被认为是一个重复,因为这是一个特定的案件的问题。

目前,我已经创建了一个用于处理我的Jenkins代理的外部对接程序,它将执行自动重新启动,而无需使用主管作为解决方案(缺少python3.7支持),因此,由于我使用openjdk:slim作为基本映像,而且我不想安装任何额外的依赖项,因此我选择安装任何其他依赖项,以弥补缺少像lsofps这样的工具,或者其他用于检查进程是否运行的工具,方法是将已启动的进程pid写入文件中,用于验证进程是否存在于path /proc/pid/status下。目前,这是可行的,也是创建此解决方案以处理代理自动启动的主要原因。

但我的问题是,这是最好的方法还是更恰当的方法?

请查找以下代码及其实现:

代码语言:javascript
复制
#!/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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-31 15:35:02

如果容器中的主进程死了,您应该让容器与它一起死掉。

Docker和上面的各个层都有重新启动整个容器的功能。基本Docker有一个docker run --restart选项,而等效的Docker选项,在退避之后重新启动死亡容器是Kubernetes吊舱的默认行为。

因此,如果您只是让一个容器自己死掉,您将有开箱即用的支持来重新启动容器引擎,而不需要在映像中添加任何特殊的支持;只需将CMD设置为您实际需要容器做的事情。这种方法的好处还在于,如果您检测到您的环境变得不稳定(“我依赖于数据库,它是不可访问的”),则进程可以选择中止自身,并让它在希望环境得到改善时稍后重新启动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53082503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档