【问题标题】:Jenkins run sh in remote docker agent stuckJenkins 在远程 docker 代理中运行 sh 卡住了
【发布时间】:2021-08-13 06:19:25
【问题描述】:

问题

我配置了一个远程 docker 实例(在服务器 A 上),它使 tcp://server_a:2376 能够为 API 提供服务。

我在服务器 B 上部署了一个 Jenkins 服务器,使用的是(Docker jenkinsci/blueocean 图像)。

现在我可以通过 TCP 端口访问服务器 A 上的 Docker 实例了:

DOCKER_HOST=tcp://<server_a>:2376 docker ps
DOCKER_HOST=tcp://<server_a>:2376 docker exec some_container "ls"

以上操作都可以。

但是当我制作一个通过 Server-A-Docker 作为代理运行的管道脚本时,问题就出现了 sh 命令卡住了,告诉:

进程显然从未在 /var/jenkins_home/workspace/agent-demo@tmp/durable-1ddcfc03 中启动

(使用 -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true 临时运行 Jenkins 可能会使问题更清晰)


管道脚本

node {
    docker.withServer('tcp://<server_a>:2376') {
        docker.image('python:latest').inside() {
            sh "python --version"
        }
    }
}

管道控制台输出

Started by user iotsofttest
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/agent-demo
[Pipeline] {
[Pipeline] withDockerServer
[Pipeline] {
[Pipeline] isUnix
[Pipeline] sh
+ docker inspect -f . python:latest
.
[Pipeline] withDockerContainer
Jenkins seems to be running inside container 5be8fc34c80a55ddcc2f5399009b97260adfc7ba9ef88985e0f7df614c707b42
but /var/jenkins_home/workspace/agent-demo could not be found among []
but /var/jenkins_home/workspace/agent-demo@tmp could not be found among []
$ docker run -t -d -u 0:0 -w /var/jenkins_home/workspace/agent-demo -v /var/jenkins_home/workspace/agent-demo:/var/jenkins_home/workspace/agent-demo:rw,z -v /var/jenkins_home/workspace/agent-demo@tmp:/var/jenkins_home/workspace/agent-demo@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** python:latest cat
$ docker top 25dccce629d42d82b177c79544cdcd2675bad8daf94f11c55f7f9821eb6e052e -eo pid,comm
[Pipeline] {
[Pipeline] sh
process apparently never started in /var/jenkins_home/workspace/agent-demo@tmp/durable-1ddcfc03
(running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)
[Pipeline] }
$ docker stop --time=1 25dccce629d42d82b177c79544cdcd2675bad8daf94f11c55f7f9821eb6e052e
$ docker rm -f 25dccce629d42d82b177c79544cdcd2675bad8daf94f11c55f7f9821eb6e052e
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // withDockerServer
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code -2
Finished: FAILURE

我在这个问题上浪费了好几天,有什么想法吗?

【问题讨论】:

    标签: linux docker jenkins docker-compose jenkins-pipeline


    【解决方案1】:

    !!!终于!!!

    经过几天的多次尝试,我找到了导致问题的关键点。


    重现问题环境

    • Server A:使用镜像jenkinsci/blueocean部署在docker-compose下的Jenkins主节点
    • 服务器B:使用镜像jenkins/inbound-agent:alpine在docker-compose下部署的Jenkins代理节点(JNLP)

    在两个 Jenkins 主/代理容器中,我将 /var/run/docker.sock 挂载到其中,以便两个 jenkins 节点都可以访问容器中的 docker,并且我们的管道应该支持 agent docker

    所以现在我制作管道脚本如下:

    pipeline {
        agent {
            docker {
                image 'python:latest'
                label 'agent-hkgw'
            }
        }
        stages {
            stage('main') {
                steps {
                    sh '''python --version'''
                }
                
            }
        }
    }
    

    好吧,当我们建造它时,卡住了:

    这就是我在问题中提到的问题。


    解决方案

    在多次尝试失败后,我注意到从 Jenkins 代理节点Pipeline built container 的挂载卷没有在 Jenkins 中明确声明代理节点。所以我尝试将/var/jenkins 文件夹从Server B 挂载到Jenkins Agent Container

    然后构建的管道像奇迹一样正常工作!

    希望这对以后遇到同样问题的人有所帮助,感谢您的回答试图提供帮助。

    【讨论】:

      【解决方案2】:

      似乎您缺少 Jenkins 容器中的 docker 客户端。您需要 docker 客户端在本地或远程运行 docker 命令

      尝试在您的 Jenkins 容器中下载/安装 docker 客户端二进制文件,并确保它位于系统 $PATH 中。

      一种安装方式(可能不适用于您的环境 - 所以 ymmv)

      curl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.03.1-ce.tgz &&
      tar --strip-components=1 -xvzf docker-17.03.1-ce.tgz -C /usr/local/bin
      

      一旦 docker 客户端在路径中,重新运行管道。此外,出于调试目的,在管道中打印 echo $(which docker) 的输出。

      【讨论】:

      • 没有,docker客户端是ok的,可以看到log显示容器创建成功,如果我在容器中手动exec,好像一切正​​常。
      【解决方案3】:

      好的,所以这可能听起来很傻,但请尝试将 python --version to 更改为 python3 --version

      另外,请确保您的 Python 容器在 shbash 中具有所有适当的路径。

      最后,确保python命令执行的docker.image.inside() black的语法是正确的。

      【讨论】:

      • 任何 sh 脚本都会卡住,即使我使用 sh 'ls'
      猜你喜欢
      • 2021-10-26
      • 1970-01-01
      • 2022-10-15
      • 2019-12-19
      • 2017-10-07
      • 1970-01-01
      • 2023-03-06
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多