首页 > 解决方案 > 在 kubernetes 集群上使用 docker 命令运行 Jenkins 作业失败“docker:未找到”

问题描述

我们正在运行一个 Kubernetes 集群来构建 Jenkins 作业。对于 pod,我们使用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

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

标签: dockerjenkinskubernetesjnlp

解决方案


/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。


推荐阅读