【问题标题】:Proper way for keep process running on a container保持进程在容器上运行的正确方法
【发布时间】:2018-10-31 11:40:52
【问题描述】:

我不知道这是否可以被视为重复,因为它是特定案例的问题。

目前,我已经在 docker 映像之外创建了一个 docker 来处理我的 Jenkins 代理,该代理将执行自动重启而不使用主管作为解决方案(缺乏对 python 3.7 的支持),并且由于我使用 openjdk:slim 作为基本映像,我不想安装任何额外的依赖项,我选择通过将启动的进程 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

【问题讨论】:

  • 为什么不在 docker swarm 服务中运行该服务?如果服务死了,swarm 只会在任何可用的主机上重新启动服务?
  • 对于这个特定的场景,我们的代理在 powerpc 或 x86 虚拟机下,对于一些项目我们不能使用 docker swarm。

标签: linux docker jenkins


【解决方案1】:

如果容器中的主进程死掉了,你应该让容器随之死掉。

Docker 和它上面的各个层都具有重启整个容器的功能。基本 Docker CLI 有一个 docker run --restart 选项,以及等效的 Docker Compose 选项,并且在一些退避后重新启动垂死的容器是 Kubernetes pod 的默认行为。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多