【问题标题】:GKE: Multi-stage dockerfiles inside JenkinsGKE:Jenkins 内部的多阶段 dockerfile
【发布时间】:2017-11-28 16:53:54
【问题描述】:

如何让 17.05+ 的 docker 在我的 Jenkins 执行器中运行?

我已按照教程进行操作:

一切都按照教程中的说明进行。

我有一个(工作的)多阶段 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)并尝试使用标签限制执行者时:

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

【问题讨论】:

  • 您的集群版本是多少?您可以通过 SSH 连接到您的 GKE 虚拟机之一并运行 docker version 吗?我不确定 jenkins 使用什么来构建图像,但如果它使用主机 docker-engine,那么您需要确保您的主机版本足够新以拥有该 docker 版本。

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


【解决方案1】:

对于阅读本文的任何人,我们在 GKE 之上使用多阶段构建,方法如下:

  1. 我们使用 docker:dind 部署一个 pod 并使用此参数运行它:

    - dockerd

    - --storage-driver=overlay2

    - -H tcp://0.0.0.0:2375

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

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

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

【讨论】:

    【解决方案2】:

    我认为您需要等到具有此功能的较新 Docker 版本的 GKE 版本发布(我相信多阶段构建已在 16.04 或 16.10 之类的版本上开始)。

    【讨论】:

    • 从 Docker 17.05 版本开始。由于这个问题,我已经从 Jenkins 切换到了 CircleCI!谢谢你的回答。
    • 嗯,我不确定您的问题是出在主机上的 docker-engine 还是 Jenkins 提供的 docker 客户端版本上。 (如果这解决了您的问题,请考虑接受答案以将问题标记为已解决。)
    • 如果我没记错的话,是我无法更新的 docker 服务器。使用更新的 docker 客户端版本并没有改变任何东西。 (等待新版本并不能真正“解决”我的问题!但我想我会接受它,因为由于这个特殊问题我不再使用 Jenkins,并且不再需要答案)
    【解决方案3】:

    即使使用 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      相关资源
      最近更新 更多