在Jenkins从属节点上运行的Jenkinsfile中执行docker build命令的最简单方法是什么?

我希望Jenkins文件做的基本示例:

node {
   sh 'docker build -t foo/bar .'
}

好像我需要将docker安装到正在执行我的Jenkinsfile的Jenkins从属映像上.有这么简单的方法吗? (Jenkins奴隶图像本身就是一个docker容器)

我的假设是否正确?

>当使用Jenkins主/从服务器运行时,Jenkins文件由Jenkins从服务器执行
>通过Manage Plugins部分安装的Jenkins插件(例如Docker插件或Gcloud SDK插件)仅安装在Jenkins主机上,因此我需要手动构建我的Jenkins slave docker镜像并在映像上安装docker?

因为我还需要访问’gcloud’命令(我通过Kubernetes Helm / Charts运行Jenkins),我一直在使用gcr.io/cloud-solutions-images/jenkins-k8s-slave图像为我的Jenkins奴隶.

目前它错误地说“码头:没找到”

最佳答案
我的假设是你想在Jenkins奴隶(这是一个Kubernetes pod,我假设由Kubernetes Jenkins Plugin创建)里面建立码头

要设置阶段,当Kubernetes创建将充当Jenkins从属的pod时,您在节点内执行的所有命令都将在其中一个容器内的Kubernetes pod中执行(默认情况下,只有一个容器,但是稍后会详细介绍.

所以你实际上是在基于gcr.io/cloud-solutions-images/jenkins-k8s-slave的容器内运行Docker命令,这很可能是基于the official Jenkins JNLP Slave,而不是容器Docker!

从现在开始,您可以采取两种方法:

>使用基于JNLP从站的略微修改的映像,该映像还包含Docker客户端,并在容器内安装Docker套接字(/var/run/docker.sock).
(You can find details on this approach here).
Here is an image that contains the Docker client and kubectl.

以下是如何配置Jenkins插件的完整视图:

enter image description here

Note that you use a different image (you can create your own and add any binary you want there) and that you mount the Docker socket inside the container.

>第一种方法的问题是您创建一个从官方JNLP从属分叉的新映像并手动添加Docker客户端.这意味着每当Jenkins或Docker有更新时,您需要手动更新图像和整个配置,这是不可取的.
使用第二种方法,您始终使用官方图像,并使用JNLP从属设备启动同一窗格中的其他容器.

07005

07006

enter image description here

正如我所说,JNLP图像将启动您在同一个窗格中指定的容器.请注意,为了从容器中使用Docker,您仍然需要安装Docker袜子.

这是我发现在容器内运行的Jenkins JNLP从站内实现构建映像的两种方法.

该示例还演示了如何使用Jenkins的凭据绑定来推送映像,以及如何在构建过程中更新Kubernetes部署.

更多资源:

> deploy Jenkins to Kubernetes as Helm chart, configure plugins to install

谢谢,
拉杜M.

转载注明原文:在Jenkins从属节点上运行的Jenkinsfile中执行docker build命令的最简单方法是什么? - 代码日志