首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让gitlab-ci-runner DinD镜像缓存中间镜像?

如何让gitlab-ci-runner DinD镜像缓存中间镜像?
EN

Stack Overflow用户
提问于 2016-02-22 22:51:10
回答 3查看 13.5K关注 0票数 40

我有一个Dockerfile,它从安装texlive-full包开始,这个包很大,而且需要很长时间。如果我在本地使用docker build,安装后创建的intermedate镜像会被缓存,并且后续的构建速度会很快。

但是,如果我推送到我自己的GitLab安装,而GitLab-CI构建运行器启动,这似乎总是从头开始,重新下载FROM镜像,并再次执行apt-get安装。对我来说,这似乎是一种巨大的浪费,所以我正在尝试弄清楚如何让GitLab DinD映像缓存构建之间的中间映像,目前为止还没有成功。

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

这是gitlab-runner DinD镜像应该能够做的事情吗?

我的.gitlab-ci.yml

代码语言:javascript
运行
复制
build_job:
    script:
    - docker build --tag=example/foo .

我的Dockerfile

代码语言:javascript
运行
复制
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 :最新的作为运行者,开始时是

代码语言:javascript
运行
复制
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 \
; \

使用以下命令注册runner:

代码语言:javascript
运行
复制
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/ \
; \

这将创建以下config.toml

代码语言:javascript
运行
复制
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尝试了不同的值,结果都是一样的:没有任何缓存)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-29 02:35:37

我想你的问题没有简单的答案。在添加一些细节之前,我强烈建议阅读来自Docker的维护者的this blog article,它最初的名称是“不要在DinD中使用Docker for CI”。

您可以尝试将/var/lib/docker声明为GitLab运行器的卷。但请注意,根据您的文件系统驱动程序,您可能会在主机上AUFS文件系统的容器中使用AUFS,这很可能会导致问题。

我建议您创建一个单独的Docker- VM,仅用于运行器,并将虚拟机中的docker.sock绑定挂载到运行器容器中。我们在GitLab上使用这个设置取得了巨大的成功(在大约12个月内构建了超过27.000个版本)。

你可以看看我们的runner with docker-compose support,它实际上是基于GitLab的runner的shell-executor。

票数 18
EN

Stack Overflow用户

发布于 2016-08-30 05:26:37

目前无法在GitLab Docker- in -Docker中缓存中间层。虽然有计划添加它(在下面的链接中提到)。现在,为了加快DinD构建速度,您可以使用覆盖文件系统。为此,您需要运行liunx内核>=3.18,并确保加载覆盖内核模块。然后在gitlab-ci.yml中设置此变量:

代码语言:javascript
运行
复制
variables:
  DOCKER_DRIVER: overlay

有关更多信息,请参阅此问题,特别是关于“优化Docker构建的状态!”的评论,请参阅“将docker executor与dind一起使用”部分。

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

票数 3
EN

Stack Overflow用户

发布于 2018-06-27 17:33:12

对于不会经常更改的构建依赖项,您可以使用gitlab映像注册表进行某种手动缓存。在CI脚本中,您不会显式地调用docker build,而是将其包装在shell脚本中

代码语言:javascript
运行
复制
# cat build_dependencies.sh
registry=registry.example.com
project=group/project
imagebase=$registry/$project/linux

docker pull $imagebase/devbase:1.0
if [ $? -ne 0 ]; then
   docker build -f devbase.dockerfile -t $imagebase/devbase:1.0 .
   docker push $imagebase/devbase:1.0
fi
...

并在您的CI中调用该脚本

代码语言:javascript
运行
复制
  ...
  script:
    - ./build_dependencies.sh

这样做的缺点是,当您的devbase.dockerfile更新时,CI将不会注意到这一点,因此您需要强制构建并推送新映像。因此,对于动态变化的图像,这并不能很好地工作,但对于您的用例,这似乎是一种可行的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35556649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档