如何在CI环境复用Docker BuildKit中RUN --mount=type=cache的构建缓存?
首先咱们理清核心问题:你用的RUN --mount=type=cache是BuildKit专属的挂载式缓存,它和Docker传统的镜像层缓存不是一回事——这种缓存默认存在BuildKit的本地存储里(本地环境是/var/lib/buildkit),但CI每次重建全新环境时,这个存储目录直接消失,自然缓存就失效了。下面给你几个清晰的解决思路,都是基于BuildKit官方支持的机制,不用手动折腾文件导入导出:
一、用Docker CLI的BuildKit缓存导出/导入功能
Docker CLI已经封装了BuildKit的缓存操作,你不用直接去用BuildKit的底层工具,用docker build的--export-cache和--import-cache参数就可以搞定:
1. 导出缓存到本地目录
在构建时,把BuildKit的所有缓存(包括你挂载的/home/build/.build-cache)导出到一个可归档的目录:
DOCKER_BUILDKIT=1 docker build . --export-cache type=local,dest=./buildkit-cache-dir
这个命令会把缓存打包到./buildkit-cache-dir目录里,你可以用CI平台的缓存机制(比如GitHub Actions的缓存动作、GitLab CI的cache配置)把这个目录保存下来。
2. CI构建前导入缓存
下次CI构建时,先恢复这个缓存目录,再用--import-cache导入:
DOCKER_BUILDKIT=1 docker build . --import-cache type=local,src=./buildkit-cache-dir
这样BuildKit就能识别到之前的挂载缓存,不用重新生成。
二、针对特定CI平台的简化方案
如果你的CI是GitHub Actions,Docker直接支持和GitHub缓存系统对接,连目录都不用自己处理:
DOCKER_BUILDKIT=1 docker build . --export-cache type=gha --import-cache type=gha
这个命令会自动把BuildKit缓存上传到GitHub的缓存服务,下次构建直接拉取,全程不用手动管理缓存目录,非常省心。
三、理清BuildKit和Docker的文档边界
你之前看的文档其实是对应关系:
RUN --mount=type=cache是BuildKit专属语法,必须开启DOCKER_BUILDKIT=1才能生效;- Docker CLI的
--export-cache/--import-cache是Docker对BuildKit缓存功能的封装,属于Docker命令,但背后调用的是BuildKit的能力; - BuildKit仓库里的文档是底层实现说明,Docker官方文档是面向用户的操作指南,两者不冲突,你跟着Docker官方的
docker build文档操作就足够了。
四、关于你Gist里的问题
你之前的失败测试是因为没正确导出BuildKit的挂载缓存——手动复制文件的方式太繁琐,而且容易漏掉BuildKit内部的缓存元数据。用上面的--export-cache/--import-cache就能替代那些复杂的引导操作,直接复用挂载缓存。
最后提醒一下:确保你的CI环境里Docker版本不低于19.03(最好20.10+),这些缓存参数在旧版本里不支持。
内容的提问来源于stack exchange,提问作者Robert Elliot

