问题描述
我们正在运行一个 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
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。