docker 在詹金斯管道内找不到

docker not found inside jenkins pipeline

我在我的 linux 机器上安装了一个 jenkins 并将它连接到我的 kubernetes 集群。

我已经在 jenkins 中安装了 dockerdocker-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。