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

什么我想要我的Jenkinsfile做的基本例子:

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

好像我需要将docker安装到正在执行我的Jenkinsfile的Jenkins从属映像上。 有这样一个简单的方法吗? (jenkins的奴隶形象本身就是docker集装箱)

我的假设是否正确?

  1. 当与Jenkins主/奴隶运行时,jenkins文件由jenkins奴隶执行
  2. 通过pipe理插件部分(例如Docker插件或Gcloud SDK插件)安装的Jenkins插件只安装在Jenkins主站上,因此我需要手动构build我的Jenkins从Docker镜像并在镜像上安装Docker。

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

目前它错误地说“docker:找不到”

我的假设是,你想要在Jenkins奴隶(这是一个Kubernetes荚,我假设由Kubernetes Jenkins Plugin创build)

为了设置阶段,当Kubernetes创build一个将作为Jenkins从服务器的pod时,在节点内部执行的所有命令将在该容器中的一个容器内的Kubernetes容器内执行(默认情况下,只有一个容器,但更多关于这个)。

所以你实际上是试图在一个基于gcr.io/cloud-solutions-images/jenkins-k8s-slave的容器中运行一个Docker命令,而这个容器很可能是基于官方的Jenkins JNLP Slave , 它不包含Docker!

从这一点来看,你可以采取两种方法:

  • 使用基于也包含Docker客户端的JNLP从服务器稍微修改过的映像,并在容器中安装Docker套接字( /var/run/docker.sock )。 ( 你可以在这里find关于这个方法的细节 )。 这是一个包含Docker客户端和kubectl

以下是如何configurationJenkins插件的完整视图:

在这里输入图像说明

请注意,您使用了不同的映像(您可以创build自己的映像并添加所需的任何二进制文件),并在容器中安装Docker套接字。

  • 第一种方法的问题是你从官方的JNLP slave创build一个新的映像,并手动添加Docker客户端。 这意味着只要Jenkins或者Docker有更新,你就需要手动更新你的镜像和整个configuration,这是不可取的。 使用第二种方法时,您总是使用官方图像,并使用JNLP从机在同一个容器中启动其他容器。

以下是下图中的完整文件

这里是Jenkins插件的文档

在这里输入图像说明

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

这些是我发现在一个容器内运行的Jenkins JNLP从站中实现build立图像的两种方式。

该示例还显示了如何使用Jenkins的凭证绑定来推送图像,以及如何将Kubernetes部署作为构build过程的一部分进行更新。

一些更多的资源:

  • 将Jenkins部署到Kubernetes作为Helm图表,configuration插件进行安装

谢谢,拉杜M