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

时间:2017-08-03 20:25:11

标签: docker jenkins kubernetes jenkins-pipeline

我想要Jenkins文件的基本示例:

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

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

我的假设是否正确?

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

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

    目前它错误地说&#34; docker:not found&#34;

1 个答案:

答案 0 :(得分:5)

我的假设是你想在Jenkins奴隶里面docker build(这是一个Kubernetes吊舱,我假设是由Kubernetes Jenkins Plugin创造的)

要设置舞台,当Kubernetes创建将充当Jenkins从属的pod时,您在节点内执行的所有命令都将在Kubernetes pod内执行,在其中一个容器内(默认情况下只有一个)容器,但稍后会有更多内容。)

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

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

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

enter image description here

  

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

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

Here is the full file from the image below

     

Here is the Jenkins Plugin documentation for doing this

enter image description here

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

我发现这两种方法可以在容器内运行的Jenkins JNLP奴隶中实现构建图像。

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

更多资源:

谢谢, Radu M