运行 在 kubernetes 集群上使用 docker 命令的 Jenkins 作业失败 "docker: not found"

Running Jenkins job with docker command on kubernetes cluster fails "docker: not found"

我们是 运行 用于构建 Jenkins 作业的 Kubernetes 集群。对于 pods,我们使用 odavid/jenkins-jnlp-slave JNLP docker 图像。我将 /var/run/docker.sock 安装到 pod 容器并将 jenkins(uid=1000) 用户添加到主机系统上的 docker 组。

当 运行 在 Jenkins 中执行 shell 脚本作业时,例如docker ps 它失败并出现错误 docker: not found

$ /bin/sh -xe /tmp/jenkins6501091583256440803.sh
+ id
uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)
+ docker ps
/tmp/jenkins2079497433467634278.sh: 8: /tmp/jenkins2079497433467634278.sh: docker: not found
Build step 'Execute shell' marked build as failure
Finished: FAILURE

有趣的是,当手动连接到 pod 并以 jenkins 用户身份直接在容器中执行 docker 命令时,它有效:

kubectl exec -it jenkins-worker-XXX -- /bin/bash
~$ su - jenkins
~$ id   
uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins),1000(jenkins)
~$ docker ps 
CONTAINER ID        IMAGE        COMMAND         CREATED         STATUS

Jenkins 的工作有何不同?同一用户,同一容器,手动连接时仅 groups=1000(jenkins),1000(jenkins) 将 1000(jenkins) 列为组 2 次。我错过了什么?

/var/run/docker.sock 只是允许 docker 客户端从容器运行 docker 命令的主机套接字。

您缺少的是容器中的 docker 客户端。

手动下载 docker 客户端并将其放置在持久卷上,并确保 docker 客户端在系统路径中。另外,确保 docker 客户端是可执行的。

此命令将为您完成。您可能需要为您的环境docker 获取正确版本的客户端

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。