如何减少CI构建期间的docker pull时间?

时间:2019-05-24 04:14:33

标签: docker kubernetes gitlab-ci gitlab-ci-runner

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

为了使其更快,我重用了先前构建的Docker映像(标记为latest)。构建时间减少了,但是现在瓶颈是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命令需要在群集和注册表之间进行大量通信。

所以我在这里有几个问题:

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

  2. 是否可以将映像保存在群集中的某个位置,以免每次都不从注册表中提取?

3 个答案:

答案 0 :(得分:0)

您可以在Docker守护程序内部运行专用pod,并将永久性卷安装到/ var / lib / docker。之后,您使用名为“ docker”的服务公开此Pod。之后,在CI作业中定义环境变量“ DOCKER_HOST = tcp:// docker”。

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

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

答案 1 :(得分:0)

有几种方法可以更快地在Pipeline中构建Docker映像。

  1. DOOD(Docker之外的Docker)

在这里,您必须将主机的/var/lib/docker.sock挂载到构建容器中。它很脆弱。但是还是太快了。

  1. DIND(Docker中的Docker)

在这里您可以使用同时具有docker cli和daemon的dind映像。它不会与主机的docker守护进程通信。整个构建过程将在pod中进行。不是100%安全,而是更快。

  1. Kaniko,Makisu,Buildah

这些是Daemoneless下一代映像构建工具,并且不依赖Docker守护程序。比DOOD和DIND更安全,也更快,并支持缓存。

答案 2 :(得分:0)

Gitlab共享跑步者没有您以前的图像(您注意到)。因此,您的选择要么像您所做的那样拉,要么与自己的跑步者一起去。上次查看时,您不能在gitlab kubernetes集成页面上安装kubernetes运行程序,因此我不得不部署自己的运行程序。

这里是一个部署,该部署创建4个运行程序(要做:找出自动缩放比例)并将其注册为postStart事件。您需要从您的项目/组(https://gitlab.com/[user]/[project]/settings/ci_cd)的“设置/共享”页面获取注册令牌。而且,您必须在同一页面上禁用共享跑步者。

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