docker 在詹金斯管道内找不到
docker not found inside jenkins pipeline
我在我的 linux 机器上安装了一个 jenkins 并将它连接到我的 kubernetes 集群。
我已经在 jenkins 中安装了 docker
和 docker-pipeline
插件,它们可以在 /var/lib/jenkins/plugins
:
下找到
docker-build-step
docker-build-step.jpi
docker-commons
docker-commons.jpi
docker-java-api
docker-java-api.jpi
docker-plugin
docker-plugin.jpi
docker-workflow
docker-workflow.jpi
并在Global Tool Configuration
中配置:
然而,当我 运行 docker.build
甚至 sh 'docker ps'
在我的管道中时,它会抛出:
/home/jenkins/agent/workspace/nodejs@tmp/durable-492ddc4c/script.sh: 1: docker: not found
EDIT
:
我用 docker 构建了自己的图像,当我执行它时,我可以 运行 docker
命令,但管道仍然抛出 docker not found
命令并发现这是因为 jnlp
没有安装 docker。关于如何在 jenkins-inbound-agent
?
中修复它的任何想法
您应该自定义 jenkins/inbound-agent 以添加 docker command
,下一个最小示例:
Dockerfile:
FROM jenkins/inbound-agent
USER root
RUN apt-get update; \
apt-get install -y wget; \
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz; \
tar zxvf docker-20.10.9.tgz; \
cp -f docker/docker /usr/local/bin; \
rm -fr docker-20.10.0.tgz docker; \
apt-get purge -y wget
建造:
docker build -t my-inbound-agent .
以上将在自定义映像中安装 docker 客户端二进制文件,让您在 inbound-agent
中拥有 docker 命令。但是,你仍然需要在启动时将 docker unix socket
挂载到 inbound-agent
,你还需要使用自定义的 agent image
,如下所示:
开始代理:
docker run --init -v /var/run/docker.sock:/var/run/docker.sock my-inbound-agent -url ......
然后,我们可以通过下一步验证它在代理中是否正常:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6ad70ee079f5 my-inbound-agent "/usr/local/bin/jenk…" 7 minutes ago Up 7 minutes jolly_fermat
$ docker exec -it 6ad70ee079f5 docker version
Client:
Version: 20.10.9
API version: 1.41
Go version: go1.16.8
Git commit: c2ea9bc
Built: Mon Oct 4 16:03:22 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.1
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: f001486
Built: Tue Dec 15 04:32:45 2020
OS/Arch: linux/amd64
Experimental: true
containerd:
Version: 1.4.3
GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b
runc:
Version: 1.0.0-rc92
GitCommit: ff819c7e9184c13b7c2607fe6c30ae19403a7aff
docker-init:
Version: 0.19.0
GitCommit: de40ad0
我已经通过添加修复了它:
tools {
<...>
'org.jenkinsci.plugins.docker.commons.tools.DockerTool' 'docker'
}
在我的管道的 environment
部分。在检查 pod 内部时,它出现在我的 $PATH 中。
然后我在调用 docker.withRegistry()
时遇到问题并使用 docker.withTool()
解决了问题,如下所示:
docker.withTool('docker'){
docker.withRegistry('repo','credentials') {
<rest of the pipeline here>
}
}
它可能不是最漂亮的解决方案,但它对我的家庭实验室很有效 use-case。
我在我的 linux 机器上安装了一个 jenkins 并将它连接到我的 kubernetes 集群。
我已经在 jenkins 中安装了 docker
和 docker-pipeline
插件,它们可以在 /var/lib/jenkins/plugins
:
docker-build-step
docker-build-step.jpi
docker-commons
docker-commons.jpi
docker-java-api
docker-java-api.jpi
docker-plugin
docker-plugin.jpi
docker-workflow
docker-workflow.jpi
并在Global Tool Configuration
中配置:
然而,当我 运行 docker.build
甚至 sh 'docker ps'
在我的管道中时,它会抛出:
/home/jenkins/agent/workspace/nodejs@tmp/durable-492ddc4c/script.sh: 1: docker: not found
EDIT
:
我用 docker 构建了自己的图像,当我执行它时,我可以 运行 docker
命令,但管道仍然抛出 docker not found
命令并发现这是因为 jnlp
没有安装 docker。关于如何在 jenkins-inbound-agent
?
您应该自定义 jenkins/inbound-agent 以添加 docker command
,下一个最小示例:
Dockerfile:
FROM jenkins/inbound-agent
USER root
RUN apt-get update; \
apt-get install -y wget; \
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz; \
tar zxvf docker-20.10.9.tgz; \
cp -f docker/docker /usr/local/bin; \
rm -fr docker-20.10.0.tgz docker; \
apt-get purge -y wget
建造:
docker build -t my-inbound-agent .
以上将在自定义映像中安装 docker 客户端二进制文件,让您在 inbound-agent
中拥有 docker 命令。但是,你仍然需要在启动时将 docker unix socket
挂载到 inbound-agent
,你还需要使用自定义的 agent image
,如下所示:
开始代理:
docker run --init -v /var/run/docker.sock:/var/run/docker.sock my-inbound-agent -url ......
然后,我们可以通过下一步验证它在代理中是否正常:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6ad70ee079f5 my-inbound-agent "/usr/local/bin/jenk…" 7 minutes ago Up 7 minutes jolly_fermat
$ docker exec -it 6ad70ee079f5 docker version
Client:
Version: 20.10.9
API version: 1.41
Go version: go1.16.8
Git commit: c2ea9bc
Built: Mon Oct 4 16:03:22 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.1
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: f001486
Built: Tue Dec 15 04:32:45 2020
OS/Arch: linux/amd64
Experimental: true
containerd:
Version: 1.4.3
GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b
runc:
Version: 1.0.0-rc92
GitCommit: ff819c7e9184c13b7c2607fe6c30ae19403a7aff
docker-init:
Version: 0.19.0
GitCommit: de40ad0
我已经通过添加修复了它:
tools {
<...>
'org.jenkinsci.plugins.docker.commons.tools.DockerTool' 'docker'
}
在我的管道的 environment
部分。在检查 pod 内部时,它出现在我的 $PATH 中。
然后我在调用 docker.withRegistry()
时遇到问题并使用 docker.withTool()
解决了问题,如下所示:
docker.withTool('docker'){
docker.withRegistry('repo','credentials') {
<rest of the pipeline here>
}
}
它可能不是最漂亮的解决方案,但它对我的家庭实验室很有效 use-case。