Jenkins 在远程 docker 代理中运行 sh 卡住了

问题描述 投票:0回答:4

问题

我配置了一个远程 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"
        }
    }
}

管道控制台输出

enter image description here

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
4个回答
7
投票

!!!终于!!!

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


问题环境重现

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

enter image description here

在 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'''
            }
            
        }
    }
}

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

enter image description here

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


解决方案

经过多次失败的尝试,我注意到从Jenkins代理节点Pipeline构建的容器的挂载卷并未在Jenkins代理节点中显式声明。所以我尝试将

/var/jenkins
文件夹从 Server B 挂载到 Jenkins Agent Container:

enter image description here

然后搭建的管道就奇迹般地正常工作了!

enter image description here

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


0
投票

好吧,这可能听起来很愚蠢,但是尝试将 python --version 更改为 python3 --version

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

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


0
投票

似乎您在 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) 的输出以进行调试。


0
投票

其他答案都不适合我。我遇到了与 OP 完全相同的问题,具有相同的输出,也许还有相同的设置。

设置

  • jenkins/jenkins docker 容器作为控制器。

  • jenkins/inbount-agent docker 容器(安装了 docker)作为构建节点。

两个容器共享

/var/run/docker.sock:/var/run/docker.sock
体积。

目标

在构建节点上使用 docker-agent 运行管道。

pipeline {
   agent {
        dockerfile {
            filename 'Dockerfile'
        }
    }
    stages {
        stage ('Run Command') {
            steps {
                script {
                    sh 'ls'
                }
            }
        }
    }
}

问题: 运行管道时,正在构建映像,容器将启动,但执行将在

sh
命令处挂起。

docker-node seems to be running inside container <SOME_CONTAINER_ID>
but /var/jenkins/workspace/<PIPELINE_NAME> could not be found among [/var/run/docker.sock, /home/jenkins/.jenkins, /home/jenkins/agent]
but /var/jenkins/workspace/<PIPELINE_NAME>@tmp could not be found among [/var/run/docker.sock, /home/jenkins/.jenkins, /home/jenkins/agent]
$ docker run -t -d -u 0:0 -u root -w /var/jenkins/workspace/<PIPELINE_NAME> -v /var/jenkins/workspace/<PIPELINE_NAME>:/var/jenkins/workspace/<PIPELINE_NAME>:rw,z -v /var/jenkins/workspace/<PIPELINE_NAME>@tmp:/var/jenkins/workspace/<PIPELINE_NAME>@tmp:rw,z -e ******** -e ******** d1e1f2e9f3f2012857400cf46ffa291632052059 cat
$ docker top 008ec6d697fc897be6d17c014a255849fb0c5f9d193f19ad919e97796777a149 -eo pid,comm
...
[Pipeline] sh
process apparently never started in /var/jenkins/workspace/<PIPELINE_NAME>@tmp/durable-0bd7b59a
(running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)
...

解决方案 按照一些关于 inbound-agent 安装的过时说明,我为 inbound-agent 构建节点设置了 Remote root directory,在

Dashboard->Nodes->node-name->Configure
/var/jenkins
中。每次管道运行时,工作区都会创建到该目录中,但 jenkins docker 插件期望工作区位于上述错误中指出的目录之一中。 将其更改为
/home/jenkins/agent
并重新启动入站代理容器解决了该问题。

希望这可以帮助其他有需要的人。

© www.soinside.com 2019 - 2024. All rights reserved.