GKE:Jenkins内部的多阶段dockerfiles

时间:2017-11-28 16:53:54

标签: jenkins google-cloud-platform jenkins-pipeline google-kubernetes-engine

如何在我的Jenkins执行程序中运行17.05+ docker?

我遵循了教程:

一切都按照教程中的描述进行。

我有一个(工作)多阶段Dockerfile我试图在Jenkins中构建,但它需要最近的Docker版本(> 17.05)。

我找不到更新此方法......

在我的管道中,如果我运行docker version,无论我做什么,我总是得到1.13.1:

docker version
Client:
 Version:      1.13.1
 API version:  1.26
 Go version:   go1.8.1
 Git commit:   092cba3
 Built:        Wed Aug 30 20:31:05 2017
 OS/Arch:      linux/amd64

Server:
 Version:      1.13.1
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.8.1
 Git commit:   092cba3
 Built:        Wed Aug 30 20:31:05 2017
 OS/Arch:      linux/amd64
 Experimental: false

在我应该用作奴隶的容器中,使用docker run -it 'image-name' bash

docker version
Client:
 Version:      17.11.0-ce
 API version:  1.34
 Go version:   go1.8.3
 Git commit:   1caf76c
 Built:        Mon Nov 20 18:36:37 2017
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Jenkins> Configure Jenkins我设置了0个执行器,只使用了我刚刚推送的图像的1个容器模板(我已经检查过它,它是最新的),选中了“始终拉图像”复选框...

当我将标签设置为Kubernetes Pod Template(例如docker-edge)并尝试使用标签限制执行者时:

    我的Jenkinsfile中的
  • node('docker-edge')不会改变任何内容
  • 在我的作业配置中,设置Pipeline Model Definition> Docker Label to docker-edge`让它停滞不前,找不到任何执行者

3 个答案:

答案 0 :(得分:5)

对于任何阅读本文的人,我们在GKE之上使用多阶段构建,这是这样的:

  1. 我们使用docker:dind部署一个pod并使用以下args运行它:

    - dockerd

    - --storage-driver=overlay2

    - -H tcp://0.0.0.0:2375

  2. 我们将此pod公开为服务(dind-service

  3. jenkins中的每个新作业都使用jnlp容器(这是k8s上的jenkins的默认值)+我们自己的自定义容器(base: FROM docker:18-dind)创建新的pod
  4. 我们使用withEnv在Jenkins作业中配置DOCKER_HOST=tcp://dind-service:2375
  5. 当我们这样做时:docker build .在我们的工作中,它使用dind pod的守护程序。
  6. 它为我们提供了出色的缓存和性能,并允许我们在gke中使用多阶段构建:)

如果您在顶级k8上使用Jenkins,我真的建议您阅读(帮助您获得了更好的理解): https://akomljen.com/set-up-a-jenkins-ci-cd-pipeline-with-kubernetes

答案 1 :(得分:3)

我认为您需要等到发布具有此功能的较新Docker版本的GKE版本(我相信多阶段版本已经开始使用16.04或16.10这样的版本)。

答案 2 :(得分:2)

即使使用Kubernetes 1.9.7,我们仍然坚持使用Docker 17.03,它不支持多级构建(17.05中提供)。在我们获得适当的Docker支持之前,您可以使用GCP的Container Builder。

而不是

sh("docker build -t ${imageTagFrontEnd} .")
sh("gcloud docker -- push ${imageTagFrontEnd}")

您可以调用容器构建器并使用

进行推送
sh("gcloud container builds submit --tag ${imageTagBackEnd} .")

请记住,对于Container Builder,前120分钟是免费的,然后您会收取一些费用。

不要忘记验证请求,您需要在执行任何操作之前包含服务帐户文件,例如:

sh("gcloud auth activate-service-account --key-file serviceAccountXYZ.json")