代码之家  ›  专栏  ›  技术社区  ›  thclpr

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

  •  0
  • thclpr  · 技术社区  · 7 年前

    我不知道这是否可以被视为一个重复,因为这是一个具体案件的问题。

    openjdk:slim 作为基本映像,我不想安装任何附加的依赖项,我选择了这样的工具来弥补缺少 lsof ps ,或其他用于检查进程是否正在运行,方法是将启动的进程pid写入一个文件,该文件将用于验证该进程是否存在于路径下 /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

    1 回复  |  直到 7 年前
        1
  •  0
  •   David Maze    7 年前

    如果容器中的主进程死亡,您应该让容器随之死亡。

    docker run --restart 基本Docker CLI的选项和等效的Docker Compose选项,以及在一些退避之后重新启动垂死的容器是Kubernetes pods的默认行为。

    因此,如果你只是让一个容器自己死掉,你将有现成的支持容器引擎重启自己,而不添加任何特殊的支持到你的形象;只要设定 CMD 你需要容器去做的事情。这种方法还有一个好处,即如果您检测到您的环境变得不稳定(我依赖于一个数据库,它无法访问),那么进程可以选择中止自己,并在环境有希望得到改善时让它稍后重新启动。

    推荐文章