【发布时间】:2021-08-09 21:49:02
【问题描述】:
我们正在运行一个 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 次。我错过了什么?
【问题讨论】:
-
docker 是您路径的一部分还是在您的脚本中提供了完全限定的路径?
-
docker 二进制文件是 jnlp pod 容器的一部分 hub.docker.com/r/odavid/jenkins-jnlp-slave docker 套接字是从主机系统安装的。
-
我的意思是:
/tmp/jenkins6501091583256440803.sh脚本得到的 PATH 环境是什么?如果它没有获取到 docker 的 PATH,则应该在脚本中提供完全限定的路径....尝试使用 docker bin 的完整路径调整 shell 脚本,看看会发生什么 -
好提示。我检查了路径变量,它是正确的,但 docker 不存在。谢谢!
标签: docker jenkins kubernetes jnlp