我希望 Jenkinsfile 执行的操作的基本示例:
node {
sh 'docker build -t foo/bar .'
}
看来我需要将 docker 安装到正在执行 Jenkinsfile 的 Jenkins 从属映像上。有一个简单的方法可以做到这一点吗? (Jenkins 从属镜像本身就是一个 docker 容器)
我的假设正确吗?
- 当与 Jenkins 主/从机一起运行时,Jenkinsfile 由 Jenkins 从机执行
- 通过“管理插件”部分安装的 Jenkins 插件(例如 Docker 插件或 Gcloud SDK 插件)仅安装在 Jenkins 主服务器上,因此我需要手动构建 Jenkins 从属 docker 映像并在映像上安装 docker?
由于我还需要访问“gcloud”命令(我通过 Kubernetes Helm/Charts 运行 Jenkins),所以我一直在使用gcr.io/cloud-solutions-images/jenkins-k8s-slave
我的詹金斯奴隶的图像。
目前它错误地显示“docker:未找到”
我的假设是你想要docker build
在 Jenkins Slave 内部(这是一个 Kubernetes Pod,我假设是由Kubernetes Jenkins 插件)
为了做好准备,当 Kubernetes 创建充当 Jenkins 从站的 pod 时,您在该节点内执行的所有命令都将在该 Kubernetes pod 的其中一个容器内执行(默认情况下只有一个容器,但是稍后会详细介绍)。
所以你实际上是在尝试在基于以下内容的容器内运行 Docker 命令gcr.io/cloud-solutions-images/jenkins-k8s-slave
,这很可能基于官方 Jenkins JNLP Slave, 其中不包含 Docker!
从现在开始,您可以采取两种方法:
- 使用基于 JNLP 从属的稍微修改的映像,该映像还包含 Docker 客户端并安装 Docker 套接字(
/var/run/docker.sock
)在容器内。
(您可以在此处找到有关此方法的详细信息).
这是包含 Docker 客户端和kubectl.
以下是如何配置 Jenkins 插件的完整视图:
请注意,您使用不同的映像(您可以创建自己的映像并在其中添加所需的任何二进制文件),并且将 Docker 套接字安装在容器内。
- 第一种方法的问题在于,您需要创建一个从官方 JNLP 从属分支派生的新映像,并手动添加 Docker 客户端。这意味着每当 Jenkins 或 Docker 有更新时,您都需要手动更新镜像和整个配置,这是不可取的。
使用第二种方法时,您始终使用官方图像,并且您使用 JNLP Slave 启动同一 Pod 中的其他容器。
这是下图中的完整文件
这是执行此操作的 Jenkins 插件文档
正如我所说,JNLP 映像将启动您在同一 pod 中指定的容器。请注意,为了从容器中使用 Docker,您仍然需要安装 Docker sock。
这是我发现的两种在容器内运行的 Jenkins JNLP 从属设备中构建映像的方法。
该示例还展示了如何使用 Jenkins 的凭证绑定推送映像,以及如何在构建过程中更新 Kubernetes 部署。
更多资源:
- 将 Jenkins 作为 Helm Chart 部署到 Kubernetes,配置要安装的插件
谢谢,
拉杜中号
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)