如何设置 GitLab+runners 来缓存 Docker 层

Kar*_*son 6 git gitlab docker

我们有自己的 gitlab 存储库。我们有自己的跑步者。

如何设置运行器和 gitlab 才能缓存 docker 层。

下面是 .gitlab-ci.yml 文件的示例:

before_script:
  - docker version

test:
  stage: test
  script:
    - docker-compose -f docker-compose.yml build my_job
    - docker-compose -f docker-compose.yml down
    - docker-compose -f docker-compose.yml up --remove-orphans --force-recreate --abort-on-container-exit
Run Code Online (Sandbox Code Playgroud)

我一直在尝试阅读如何执行此操作,但所有文档都非常令人困惑。

https://gitlab.com/gitlab-org/gitlab-ce/issues/17861指出:

使用 shell 执行器

这是目前当您不想缓存 docker 层时使用的最佳执行器。除了将 gitlab-runner 添加到 docker 组之外,它基本上不需要任何更改。

鉴于 git fetch 它提供了缓存 docker 层的最佳可能性。

如何设置这一点?我只是在文档中找不到这个。

小智 7

我发现使用 docker-in-docker 执行器实际上确实支持缓存层(即使文档另有说明)。
只需先拉取图像,然后在cache-from标志中指定它即可。
允许|| true拉取映像失败,这对于第一次构建映像时很重要(例如在新分支中)

  script:
    - docker pull $OLD_DOCKERIMAGE || true
    - docker build -t $NEW_DOCKERIMAGE --cache-from $OLD_DOCKERIMAGE .
    - docker push $NEW_DOCKERIMAGE
Run Code Online (Sandbox Code Playgroud)

附加要求:此功能需要DOCKER_BUILDKIT启用,并且构建必须使用构建参数完成:--build-arg BUILDKIT_INLINE_CACHE=1

  • 好一个!但是,还需要两件事:启用“DOCKER_BUILDKIT”并使用“--build-arg BUILDKIT_INLINE_CACHE=1”运行构建。 (2认同)

小智 5

由于您正在构建 docker 映像作为 CI 作业的一部分,这意味着您很可能已经使用了 shell 执行器。只有 3 种方法可以配置 gitlab 运行程序,以支持构建 docker 映像作为 CI 作业的一部分:https ://docs.gitlab.com/ee/ci/docker/using_docker_build.html

本文档还解释了如何配置 shell 执行器以及所有 3 种配置方式之间的权衡。

基本上,唯一不允许缓存 docker 层的运行器配置是使用 docker-in-docker 执行器。

使用 shell 和 docker 套接字绑定始终在托管 gitlab 运行程序的虚拟机上本地缓存层,因此无需进一步配置即可启用缓存。