如何在CI构建期间减少docker拉动时间?

如何在CI构建期间减少docker拉动时间?,docker,kubernetes,gitlab-ci,gitlab-ci-runner,Docker,Kubernetes,Gitlab Ci,Gitlab Ci Runner,我在Kubernetes集群上使用GitLab Runner来运行CI作业。我想让构建作业运行得更快 为了使它们更快,我重用了以前构建的Docker映像(标记为最新版本)。构建时间减少了,但现在的瓶颈是pull命令,它占用了大约60-70%的时间 下面是.gitlab ci.yml的片段: build:sheets: stage: build image: docker:stable services: - docker:dind before_script: -

我在Kubernetes集群上使用GitLab Runner来运行CI作业。我想让构建作业运行得更快

为了使它们更快,我重用了以前构建的Docker映像(标记为
最新版本
)。构建时间减少了,但现在的瓶颈是
pull
命令,它占用了大约60-70%的时间

下面是
.gitlab ci.yml
的片段:

build:sheets:
  stage: build
  image: docker:stable
  services:
    - docker:dind
  before_script:
    - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin
  script:
    - docker pull $SHEETS_LATEST || true
    - docker build --cache-from $SHEETS_LATEST --tag $SHEETS_TAG --tag $SHEETS_LATEST .
    - docker push $SHEETS_TAG
    - docker push $SHEETS_LATEST
我使用Gitlab注册表,因此
pull
命令需要集群和注册表之间进行大量通信

所以我这里有几个问题:

  • 是否值得在集群上部署我自己的docker注册表以节省每次构建的几分钟时间?

  • 是否有一种方法可以将图像保存在集群上的某个位置,以避免每次都从注册表中提取图像?


  • 您可以运行内部带有Docker守护进程的专用pod,并将永久卷装入/var/lib/Docker。之后,您将使用名为“docker”的服务公开此pod。然后在CI作业中定义环境变量“DOCKER\u HOST”=tcp://docker“

    这样,所有构建和映像都存储在Docker守护进程中,运行在专用的pod中。由于Docker build cache,您不会浪费时间拉取图像,而且构建运行得更快


    请记住监视持久卷上的磁盘空间使用情况,并定期触发“docker system prune”。

    有几种方法可以更快地在管道中构建docker映像

  • DOOD(Docker出Docker)
  • 在这里,您必须在构建容器中装载主机的/var/lib/docker.sock。它是脆弱的。但还是太快了

  • 迪恩(码头工人中的码头工人)
  • 在这里,您可以使用具有docker cli和守护进程的dind映像。它不与主机的docker守护进程通信。整个构建过程将在pod内进行。不是100%安全,但速度更快

  • Kaniko,Makisu,Buildah

  • 这些是无后台程序的下一代映像构建工具,不依赖于Docker后台程序。比DOOD和DIND更安全,速度更快,支持缓存

    Gitlab共享跑步者没有您以前的图像可用(如您所注意到的)。所以你的选择要么像你现在做的那样拉它,要么和你自己的跑步者一起跑。上次我查看时,您无法在gitlab kubernetes集成页面上安装kubernetes runner,因此我必须部署自己的runner

    下面是一个创建4个运行程序(todo:figure out autoscaling)并将其注册为启动后事件的部署。您需要从项目或组的设置/cicd页面获取注册令牌()。您必须禁用同一页面中的共享跑步者

    kind: Deployment
    metadata:
      name: gitlabrunner
      labels:
        app: gitlabrunner
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: gitlabrunner
      template:
        metadata:
          labels:
            app: gitlabrunner
          name: gitlabrunner
        spec:
          containers:
          - name: gitlabrunner
            image: gitlab/gitlab-runner
            volumeMounts:
            - name: dockersock
              mountPath: "/var/run/docker.sock"
            lifecycle:
              postStart:
                exec:
                  command: ["/bin/sh", "-c", "gitlab-runner register -n --url https://gitlab.com/ --registration-token [YOUR_REGISTRATION_TOKEN] --executor docker --description 'My Docker Runner' --docker-image 'docker:stable' --docker-volumes /var/run/docker.sock:/var/run/docker.sock"]
          volumes:
          - name: dockersock
            hostPath:
              path: /var/run/docker.sock
    

    谢谢你的回答,但是你能解释一下如何在GitLab Runner中启动这样一个pod吗?谢谢你的概述,但这并不能解释如何在GitLab CI中使用它。我不使用GitLab共享Runner。我已经用头盔将它们部署到我的集群中。问题是如何在集群内保存图像,这样我就可以避免与注册表的额外通信。