GKE:Jenkins内部的多阶段dockerfiles

Tho*_*jon 6 jenkins google-cloud-platform google-kubernetes-engine jenkins-pipeline

如何在我的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
Run Code Online (Sandbox Code Playgroud)

在我应该用作奴隶的容器中,有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?
Run Code Online (Sandbox Code Playgroud)

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

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

  • node('docker-edge') 在我的Jenkinsfile中没有任何改变
  • 在我的作业配置中,设置Pipeline Model Definition> Docker Label todocker-edge`使其停止并且找不到任何执行程序

etl*_*lsh 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容器(这是k8之上的jenkins的默认设置)+我们自己的自定义容器(base: FROM docker:18-dind)创建一个新容器。
  4. 我们DOCKER_HOST=tcp://dind-service:2375使用withEnv 配置内部的Jenkins作业。
  5. 当我们做的时候:docker build .在我们的工作中,它使用dind pod的守护进程。
  6. 它为我们提供了出色的缓存和性能,并允许我们在gke中使用多阶段构建:)

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