我如何让gitlab-ci-runner的DinD图像caching中间图像?

我有一个Dockerfile,从安装texlive-full软件包开始,这个软件包很大,需要很长时间。 如果我的docker build在本地docker build ,安装后创build的intermedate镜像被caching,后续的构build速度很快。

但是,如果我推送到我自己的GitLab安装,并启动GitLab-CI build runner,似乎总是从头开始,重新下载FROM映像,并再次执行apt-get安装。 这对我来说似乎是一个巨大的浪费,所以我想弄清楚如何让GitLab DinD图像caching构build之间的中间映像,到目前为止没有运气。

我已经尝试使用--cache-dir--docker-cache-dir作为gitlab-runner register命令,无济于事。

这甚至是gitlab-runner的DinD图像应该能够做的吗?

我的.gitlab-ci.yml

 build_job: script: - docker build --tag=example/foo . 

我的Dockerfile

 FROM php:5.6-fpm MAINTAINER Roel Harbers <roel.harbers@example.com> RUN apt-get update && apt-get install -qq -y --fix-missing --no-install-recommends texlive-full RUN echo Do other stuff that has to be done every build. 

我使用GitLab CE 8.4.0和gitlab / gitlab-runner:最新的作为跑步者,开始作为

 docker run -d --name gitlab-runner --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/local/gitlab-ci-runner/config:/etc/gitlab-runner \ gitlab/gitlab-runner:latest \ ; \ 

赛跑者注册使用:

 docker exec -it gitlab-runner gitlab-runner register \ --name foo.example.com \ --url https://gitlab.example.com/ci \ --cache-dir /cache/build/ \ --executor docker \ --docker-image gitlab/dind:latest \ --docker-privileged \ --docker-disable-cache false \ --docker-cache-dir /cache/docker/ \ ; \ 

这将创build以下config.toml

 concurrent = 1 [[runners]] name = "foo.example.com" url = "https://gitlab.example.com/ci" token = "foobarsldkflkdsjfkldsj" tls-ca-file = "" executor = "docker" cache_dir = "/cache/build/" [runners.docker] image = "gitlab/dind:latest" privileged = true disable_cache = false volumes = ["/cache"] cache_dir = "/cache/docker/" 

(我已经尝试了不同的值cache_dirdocker_cache_dirdisable_cache ,所有的结果都是一样的:没有任何caching)

我想这个问题没有简单的答案。 在添加一些细节之前,我强烈build议阅读DinD的维护人员的博客文章 ,该文章最初名为“不要在Docker for CI中使用Docker”。

你可能会尝试的是将/var/lib/docker声明为你的GitLab跑步者的体积。 但是请注意,根据文件系统驱动程序的不同,您可能会在主机上的AUFS文件系统的容器中使用AUFS,这很可能会导致问题。

我build议你创build一个单独的 Docker-VM,仅用于docker.sock ,并将VM中的docker.sock绑定到runner-container中。 我们使用GitLab这个设置取得了巨大的成功(在大约12个月内> 27.000的构build)。

你可以看看我们的docker-compose支持 ,它实际上是基于GitLab的runner的shell执行者。

目前,您无法在GitLab Docker-in-Docker中caching中间层。 尽pipe有计划添加(在下面的链接中提到)。 今天你可以做什么来加快你的DinD构build是使用覆盖文件系统。 要做到这一点,你需要运行一个liunx内核> = 3.18,并确保你加载覆盖内核模块。 然后你在你的gitlab-ci.yml中设置这个variables:

 variables: DOCKER_DRIVER: overlay 

有关更多信息,请参阅此问题,尤其是有关“优化Docker构build的状态!”的评论,请参阅“使用docker executor with dind”一节。

https://gitlab.com/gitlab-org/gitlab-ce/issues/17861#note_12991518