docker - 在 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 次。我错过了什么?
解决方案
/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。
推荐阅读
- rollup - 需要在汇总中未定义
- google-cloud-platform - 创建 GCP 深度学习 VM 映像时出错
- python-3.x - 意外的元组拆包,可能的范围问题/混乱
- ios - dateFormatter 返回带有两位数年份说明符的错误日期
- excel - 对同一项目进行汇总
- django - 在保存 Django 时获得“此选择不是可用的选择之一”
- php - 将数据从 CSV 文件插入 mysql 数据库,最后一行的数据有双重输入
- python - “浮动”对象在读取帧时不能被解释为整数
- nativescript - 如何在 nativescript-vue 中实现页面加载器?
- php - 来自php数据库的json,如何在json对象中创建数组