【发布时间】:2023-03-07 14:04:02
【问题描述】:
我刚刚在 Jenkins 服务器上运行 Jenkins 声明式管道时遇到了一个问题,该服务器本身在 Docker 中运行,可以从主机访问 docker.sock。
管道的结构比较简单:
pipeline {
agent {
docker { image 'gradle:jdk11' }
}
stages {
stage('Checkout') {
steps {
// ...
}
}
stage('Assemble public API documentation') {
environment {
// ...
}
steps {
// ...
}
}
stage('Generate documentation') {
steps {
// ...
}
}
stage('Upload documentation to Firebase') {
agent {
docker {
image 'node:12'
reuseNode false
}
}
steps {
// ...
}
}
}
}
想法是在第一个容器中运行三个阶段,然后为最后一个阶段创建一个新容器。 进入最后阶段时打印如下:
[Pipeline] stage
[Pipeline] { (Upload documentation to Firebase)
[Pipeline] getContext
[Pipeline] isUnix
[Pipeline] sh
+ docker inspect -f . node:12
/var/jenkins_home/workspace/publish_public_api_doc@tmp/durable-bc4d65d1/script.sh: 1: /var/jenkins_home/workspace/publish_public_api_doc@tmp/durable-bc4d65d1/script.sh: docker: not found
[Pipeline] isUnix
[Pipeline] sh
+ docker pull node:12
/var/jenkins_home/workspace/publish_public_api_doc@tmp/durable-297d223a/script.sh: 1: /var/jenkins_home/workspace/publish_public_api_doc@tmp/durable-297d223a/script.sh: docker: not found
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
$ docker stop --time=1 367647f97c9eed52bf85c13c2bc2203bb7194adac803d37cab0e0d0435325efa
$ docker rm -f 367647f97c9eed52bf85c13c2bc2203bb7194adac803d37cab0e0d0435325efa
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 127
Finished: FAILURE
我真的不明白这里发生了什么。
为了调试它,我登录到那台机器,并从主机以及正在运行的 Jenkins 容器内部运行 docker 命令,它正在工作。
设置方式是 Docker 客户端安装在镜像中,即二进制文件本身不共享到容器中。
由于docker 命令是“未找到”,我唯一的解释是docker 命令为最后阶段启动代理 没有在“顶级”中执行Jenkins 容器,但是在 JDK 中,它里面没有 docker 可执行文件。
然而,这似乎是出乎意料的,如果不是一个错误的话。
如果有人对此有所了解,我将不胜感激。
【问题讨论】:
标签: docker jenkins jenkins-pipeline jenkins-declarative-pipeline docker-in-docker