跨机器使用 Docker 构建的缓存

标签:Docker

在使用 GitLab CI 时,我经常被漫长的构建时间影响工作效率,尤其是在一台机器上已经 docker build 过的镜像,另一台机器上却需要重新构建,没法利用缓存。
查了一番文档后,我发现 docker build 还能使用外部缓存来加速构建。

要使用外部缓存的话,需要先启用 BuildKit:
export DOCKER_BUILDKIT=1

然后在构建时指定 BUILDKIT_INLINE_CACHE=1 参数,这样构建的镜像会带上缓存的元数据;再将其推到仓库就可以供其他机器使用了:
docker build -t myname/myapp --build-arg BUILDKIT_INLINE_CACHE=1 .
docker push myname/myapp

最后在另一台机器上,使用 --cache-from 指定缓存所在的镜像名,就能用这个镜像的缓存来加速构建了:
docker build --cache-from myname/myapp .
注:如果依赖多个镜像的话,--cache-from 可以多次指定不同的镜像名。

不过,使用外部缓存构建会比内部缓存慢一些,所以没用到多机器构建时,还是用内部缓存比较好。

此外,因为在写 gitlab-ci.yml 时,并不能区分哪台机器是第一次构建的,所以这两个构建的参数需要融合在一起:
export DOCKER_BUILDKIT=1
docker pull myname/myapp || true  # 有可能是第一次构建,pull 会失败,所以用 true 忽略错误
docker build -t myname/myapp --cache-from myname/myapp --build-arg BUILDKIT_INLINE_CACHE=1 .  # 构建 myname/myapp,并指定使用外部 myname/myapp 的缓存
docker push myname/myapp

最后,这样生成的镜像会带有额外的数据,一般不应该直接部署到生成环境,而应该作为中间镜像使用。

2条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?