Docker 构建分布式缓存深度解析
在大型团队或多分支 CI 流水线中,每次构建都从零拉取基础镜像和下载依赖是巨大的时间浪费。分布式构建缓存 允许多个构建节点、开发者和 CI 任务共享同一份构建缓存(包括层缓存和依赖包缓存),将构建时间从分钟级缩减至秒级。理解其原理与实现方式,是构建高效、标准化的企业级 DevOps 流水线的关键。
一、为什么需要分布式缓存?
| 重复下载依赖 | 每个构建节点独立拉取 Maven/NPM 包,占用带宽和时间 | 共享 .m2 等包缓存,跨节点复用 |
| 镜像层重建 | 不同构建节点无法共享层缓存,每次从头构建 | 共享层缓存,直接复用相同层的哈希 |
| 冷启动慢 | 新节点或清理后无缓存,构建时间长 | 通过注册表或远程存储“预热”缓存 |
| 协同浪费 | 团队成员各自本地构建,无法利用他人已生成的层 | 共享缓存,减少整体计算消耗 |
目标:让缓存像代码一样可以在构建节点间流动,实现“一次构建,处处复用”。
二、分布式缓存的核心原理
Docker 构建的缓存本质是内容寻址的层和依赖包仓库。分布式缓存就是将这些数据从单机本地移植到团队共享的存储介质上,并通过标准化协议(Registry API、REST 文件存储)供所有构建节点访问。
2.1 两层缓存模型
| 层缓存(Image Layer Cache) | 构建生成的只读层,由指令哈希标识 | 导出为镜像推送到 Registry;或通过 BuildKit 内联缓存附加到镜像 |
| 依赖包缓存(Package Cache) | Maven .m2、Gradle caches、npm 等包管理器本地仓库 | 通过 BuildKit 缓存挂载 + 共享文件系统(如 NFS、S3)或专门缓存服务 |
2.2 BuildKit 的分布式缓存机制
新一代 BuildKit 引擎提供了三种远程缓存模式,可将构建缓存导出到 Registry 或外部存储,供其他构建节点导入。
| 内联缓存(Inline Cache) | 将构建缓存元数据嵌入到最终镜像的 manifest 中 | 镜像仓库 | 简单,无需额外存储,但镜像体积略增 |
| 独立导出缓存(Registry Cache) | 将缓存作为独立的 OCI 镜像推送到仓库,与最终镜像分离 | 镜像仓库(独立 tag) | 灵活,不影响生产镜像,可分别管理缓存与镜像 |
| 本地/远程导出缓存(Local/Remote Cache) | 将缓存导出为本地目录或上传到 S3/Azure Blob 等 | 本地目录或对象存储 | 适合离线或专用缓存服务器,性能极高 |
工作流程:
- 构建时 –cache-from 指定从哪个远程缓存源导入层信息。
- 构建完成后 –cache-to 将本次新生成的缓存导出到远程源,形成闭环。
三、分布式缓存架构实现
3.1 基于镜像仓库的层缓存共享
这是最常用的方式,利用现有的 Docker Registry 作为缓存交换中心。
CI 节点 B (新)镜像仓库 (Harbor)CI 节点 ACI 节点 B (新)镜像仓库 (Harbor)CI 节点 A#mermaid-svg-Ec9DPP5Ctbw21ObE{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ec9DPP5Ctbw21ObE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ec9DPP5Ctbw21ObE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ec9DPP5Ctbw21ObE .error-icon{fill:#552222;}#mermaid-svg-Ec9DPP5Ctbw21ObE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ec9DPP5Ctbw21ObE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ec9DPP5Ctbw21ObE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ec9DPP5Ctbw21ObE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ec9DPP5Ctbw21ObE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ec9DPP5Ctbw21ObE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ec9DPP5Ctbw21ObE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ec9DPP5Ctbw21ObE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ec9DPP5Ctbw21ObE .marker.cross{stroke:#333333;}#mermaid-svg-Ec9DPP5Ctbw21ObE svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ec9DPP5Ctbw21ObE p{margin:0;}#mermaid-svg-Ec9DPP5Ctbw21ObE .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Ec9DPP5Ctbw21ObE text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Ec9DPP5Ctbw21ObE .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Ec9DPP5Ctbw21ObE .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-Ec9DPP5Ctbw21ObE .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Ec9DPP5Ctbw21ObE .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Ec9DPP5Ctbw21ObE #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Ec9DPP5Ctbw21ObE .sequenceNumber{fill:white;}#mermaid-svg-Ec9DPP5Ctbw21ObE #sequencenumber{fill:#333;}#mermaid-svg-Ec9DPP5Ctbw21ObE #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Ec9DPP5Ctbw21ObE .messageText{fill:#333;stroke:none;}#mermaid-svg-Ec9DPP5Ctbw21ObE .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Ec9DPP5Ctbw21ObE .labelText,#mermaid-svg-Ec9DPP5Ctbw21ObE .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Ec9DPP5Ctbw21ObE .loopText,#mermaid-svg-Ec9DPP5Ctbw21ObE .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Ec9DPP5Ctbw21ObE .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Ec9DPP5Ctbw21ObE .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Ec9DPP5Ctbw21ObE .noteText,#mermaid-svg-Ec9DPP5Ctbw21ObE .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Ec9DPP5Ctbw21ObE .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Ec9DPP5Ctbw21ObE .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Ec9DPP5Ctbw21ObE .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Ec9DPP5Ctbw21ObE .actorPopupMenu{position:absolute;}#mermaid-svg-Ec9DPP5Ctbw21ObE .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Ec9DPP5Ctbw21ObE .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Ec9DPP5Ctbw21ObE .actor-man circle,#mermaid-svg-Ec9DPP5Ctbw21ObE line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Ec9DPP5Ctbw21ObE :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}存储缓存层索引构建时检查缓存标签中的层,匹配则直接复用构建镜像 my-app:latestdocker push my-app:latest推送缓存 (–cache-to type=registry,ref=my-app:cache)拉取缓存标签 (my-app:cache)docker build –cache-from my-app:cache …构建完成,可选更新缓存标签
- 缓存标签:与正式镜像标签分开,如 my-app:cache,用于存储层缓存数据。多个构建节点都引用该标签,实现缓存共享。
- 多版本缓存:可设置多个 –cache-from 源(如 cache, cache-master, cache-feature),提高命中率。
3.2 基于共享文件系统的依赖包缓存
对于 Maven、Gradle 等依赖包管理器,可通过 BuildKit 的 –mount=type=cache 将缓存目录映射到宿主机的共享存储。
#mermaid-svg-eemorJf2rx6L7bN7{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-eemorJf2rx6L7bN7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eemorJf2rx6L7bN7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eemorJf2rx6L7bN7 .error-icon{fill:#552222;}#mermaid-svg-eemorJf2rx6L7bN7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eemorJf2rx6L7bN7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eemorJf2rx6L7bN7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eemorJf2rx6L7bN7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eemorJf2rx6L7bN7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eemorJf2rx6L7bN7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eemorJf2rx6L7bN7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eemorJf2rx6L7bN7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eemorJf2rx6L7bN7 .marker.cross{stroke:#333333;}#mermaid-svg-eemorJf2rx6L7bN7 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eemorJf2rx6L7bN7 p{margin:0;}#mermaid-svg-eemorJf2rx6L7bN7 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-eemorJf2rx6L7bN7 .cluster-label text{fill:#333;}#mermaid-svg-eemorJf2rx6L7bN7 .cluster-label span{color:#333;}#mermaid-svg-eemorJf2rx6L7bN7 .cluster-label span p{background-color:transparent;}#mermaid-svg-eemorJf2rx6L7bN7 .label text,#mermaid-svg-eemorJf2rx6L7bN7 span{fill:#333;color:#333;}#mermaid-svg-eemorJf2rx6L7bN7 .node rect,#mermaid-svg-eemorJf2rx6L7bN7 .node circle,#mermaid-svg-eemorJf2rx6L7bN7 .node ellipse,#mermaid-svg-eemorJf2rx6L7bN7 .node polygon,#mermaid-svg-eemorJf2rx6L7bN7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eemorJf2rx6L7bN7 .rough-node .label text,#mermaid-svg-eemorJf2rx6L7bN7 .node .label text,#mermaid-svg-eemorJf2rx6L7bN7 .image-shape .label,#mermaid-svg-eemorJf2rx6L7bN7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-eemorJf2rx6L7bN7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eemorJf2rx6L7bN7 .rough-node .label,#mermaid-svg-eemorJf2rx6L7bN7 .node .label,#mermaid-svg-eemorJf2rx6L7bN7 .image-shape .label,#mermaid-svg-eemorJf2rx6L7bN7 .icon-shape .label{text-align:center;}#mermaid-svg-eemorJf2rx6L7bN7 .node.clickable{cursor:pointer;}#mermaid-svg-eemorJf2rx6L7bN7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eemorJf2rx6L7bN7 .arrowheadPath{fill:#333333;}#mermaid-svg-eemorJf2rx6L7bN7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eemorJf2rx6L7bN7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eemorJf2rx6L7bN7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eemorJf2rx6L7bN7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eemorJf2rx6L7bN7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eemorJf2rx6L7bN7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eemorJf2rx6L7bN7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eemorJf2rx6L7bN7 .cluster text{fill:#333;}#mermaid-svg-eemorJf2rx6L7bN7 .cluster span{color:#333;}#mermaid-svg-eemorJf2rx6L7bN7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eemorJf2rx6L7bN7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eemorJf2rx6L7bN7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-eemorJf2rx6L7bN7 .icon-shape,#mermaid-svg-eemorJf2rx6L7bN7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eemorJf2rx6L7bN7 .icon-shape p,#mermaid-svg-eemorJf2rx6L7bN7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eemorJf2rx6L7bN7 .icon-shape .label rect,#mermaid-svg-eemorJf2rx6L7bN7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eemorJf2rx6L7bN7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eemorJf2rx6L7bN7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eemorJf2rx6L7bN7 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
共享存储
构建节点集群
挂载 .m2 缓存
挂载 .m2 缓存
挂载 .m2 缓存
节点 A
节点 B
节点 C
NFS 或 S3 挂载maven-repo
构建时 Dockerfile 中指定 RUN –mount=type=cache,target=/root/.m2,id=maven-cache,sharing=locked mvn package,其中 id 为全局唯一缓存 ID,sharing=locked 确保并发安全。宿主机将该 ID 映射到 NFS 上的目录,所有节点共享同一份依赖缓存。即使 Docker 层重建,已下载的 jar 仍从 NFS 直接读取。
3.3 内联缓存模式
内联缓存将层缓存元数据附加到最终镜像中,使用最简单,但会增加镜像 manifest 大小。适合小型项目或想避免额外标签管理的场景。
#mermaid-svg-JlUV4OoHbzJSlw4n{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JlUV4OoHbzJSlw4n .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JlUV4OoHbzJSlw4n .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JlUV4OoHbzJSlw4n .error-icon{fill:#552222;}#mermaid-svg-JlUV4OoHbzJSlw4n .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JlUV4OoHbzJSlw4n .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JlUV4OoHbzJSlw4n .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JlUV4OoHbzJSlw4n .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JlUV4OoHbzJSlw4n .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JlUV4OoHbzJSlw4n .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JlUV4OoHbzJSlw4n .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JlUV4OoHbzJSlw4n .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JlUV4OoHbzJSlw4n .marker.cross{stroke:#333333;}#mermaid-svg-JlUV4OoHbzJSlw4n svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JlUV4OoHbzJSlw4n p{margin:0;}#mermaid-svg-JlUV4OoHbzJSlw4n .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-JlUV4OoHbzJSlw4n .cluster-label text{fill:#333;}#mermaid-svg-JlUV4OoHbzJSlw4n .cluster-label span{color:#333;}#mermaid-svg-JlUV4OoHbzJSlw4n .cluster-label span p{background-color:transparent;}#mermaid-svg-JlUV4OoHbzJSlw4n .label text,#mermaid-svg-JlUV4OoHbzJSlw4n span{fill:#333;color:#333;}#mermaid-svg-JlUV4OoHbzJSlw4n .node rect,#mermaid-svg-JlUV4OoHbzJSlw4n .node circle,#mermaid-svg-JlUV4OoHbzJSlw4n .node ellipse,#mermaid-svg-JlUV4OoHbzJSlw4n .node polygon,#mermaid-svg-JlUV4OoHbzJSlw4n .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JlUV4OoHbzJSlw4n .rough-node .label text,#mermaid-svg-JlUV4OoHbzJSlw4n .node .label text,#mermaid-svg-JlUV4OoHbzJSlw4n .image-shape .label,#mermaid-svg-JlUV4OoHbzJSlw4n .icon-shape .label{text-anchor:middle;}#mermaid-svg-JlUV4OoHbzJSlw4n .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JlUV4OoHbzJSlw4n .rough-node .label,#mermaid-svg-JlUV4OoHbzJSlw4n .node .label,#mermaid-svg-JlUV4OoHbzJSlw4n .image-shape .label,#mermaid-svg-JlUV4OoHbzJSlw4n .icon-shape .label{text-align:center;}#mermaid-svg-JlUV4OoHbzJSlw4n .node.clickable{cursor:pointer;}#mermaid-svg-JlUV4OoHbzJSlw4n .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JlUV4OoHbzJSlw4n .arrowheadPath{fill:#333333;}#mermaid-svg-JlUV4OoHbzJSlw4n .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JlUV4OoHbzJSlw4n .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JlUV4OoHbzJSlw4n .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JlUV4OoHbzJSlw4n .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JlUV4OoHbzJSlw4n .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JlUV4OoHbzJSlw4n .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JlUV4OoHbzJSlw4n .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JlUV4OoHbzJSlw4n .cluster text{fill:#333;}#mermaid-svg-JlUV4OoHbzJSlw4n .cluster span{color:#333;}#mermaid-svg-JlUV4OoHbzJSlw4n div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JlUV4OoHbzJSlw4n .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JlUV4OoHbzJSlw4n rect.text{fill:none;stroke-width:0;}#mermaid-svg-JlUV4OoHbzJSlw4n .icon-shape,#mermaid-svg-JlUV4OoHbzJSlw4n .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JlUV4OoHbzJSlw4n .icon-shape p,#mermaid-svg-JlUV4OoHbzJSlw4n .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JlUV4OoHbzJSlw4n .icon-shape .label rect,#mermaid-svg-JlUV4OoHbzJSlw4n .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JlUV4OoHbzJSlw4n .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JlUV4OoHbzJSlw4n .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JlUV4OoHbzJSlw4n :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
构建镜像
–cache-to type=inline
推送镜像到 Registry
镜像 manifest 内嵌缓存信息
后续构建
–cache-from 同镜像标签
3.4 远程对象存储缓存(如 AWS S3)
BuildKit 支持直接将缓存导出到 S3 兼容的对象存储,不影响镜像仓库。适合云原生环境,可横向扩展到大规模集群。
#mermaid-svg-exki5Nshd65TMlrQ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-exki5Nshd65TMlrQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-exki5Nshd65TMlrQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-exki5Nshd65TMlrQ .error-icon{fill:#552222;}#mermaid-svg-exki5Nshd65TMlrQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-exki5Nshd65TMlrQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-exki5Nshd65TMlrQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-exki5Nshd65TMlrQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-exki5Nshd65TMlrQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-exki5Nshd65TMlrQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-exki5Nshd65TMlrQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-exki5Nshd65TMlrQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-exki5Nshd65TMlrQ .marker.cross{stroke:#333333;}#mermaid-svg-exki5Nshd65TMlrQ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-exki5Nshd65TMlrQ p{margin:0;}#mermaid-svg-exki5Nshd65TMlrQ .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-exki5Nshd65TMlrQ .cluster-label text{fill:#333;}#mermaid-svg-exki5Nshd65TMlrQ .cluster-label span{color:#333;}#mermaid-svg-exki5Nshd65TMlrQ .cluster-label span p{background-color:transparent;}#mermaid-svg-exki5Nshd65TMlrQ .label text,#mermaid-svg-exki5Nshd65TMlrQ span{fill:#333;color:#333;}#mermaid-svg-exki5Nshd65TMlrQ .node rect,#mermaid-svg-exki5Nshd65TMlrQ .node circle,#mermaid-svg-exki5Nshd65TMlrQ .node ellipse,#mermaid-svg-exki5Nshd65TMlrQ .node polygon,#mermaid-svg-exki5Nshd65TMlrQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-exki5Nshd65TMlrQ .rough-node .label text,#mermaid-svg-exki5Nshd65TMlrQ .node .label text,#mermaid-svg-exki5Nshd65TMlrQ .image-shape .label,#mermaid-svg-exki5Nshd65TMlrQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-exki5Nshd65TMlrQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-exki5Nshd65TMlrQ .rough-node .label,#mermaid-svg-exki5Nshd65TMlrQ .node .label,#mermaid-svg-exki5Nshd65TMlrQ .image-shape .label,#mermaid-svg-exki5Nshd65TMlrQ .icon-shape .label{text-align:center;}#mermaid-svg-exki5Nshd65TMlrQ .node.clickable{cursor:pointer;}#mermaid-svg-exki5Nshd65TMlrQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-exki5Nshd65TMlrQ .arrowheadPath{fill:#333333;}#mermaid-svg-exki5Nshd65TMlrQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-exki5Nshd65TMlrQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-exki5Nshd65TMlrQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-exki5Nshd65TMlrQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-exki5Nshd65TMlrQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-exki5Nshd65TMlrQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-exki5Nshd65TMlrQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-exki5Nshd65TMlrQ .cluster text{fill:#333;}#mermaid-svg-exki5Nshd65TMlrQ .cluster span{color:#333;}#mermaid-svg-exki5Nshd65TMlrQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-exki5Nshd65TMlrQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-exki5Nshd65TMlrQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-exki5Nshd65TMlrQ .icon-shape,#mermaid-svg-exki5Nshd65TMlrQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-exki5Nshd65TMlrQ .icon-shape p,#mermaid-svg-exki5Nshd65TMlrQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-exki5Nshd65TMlrQ .icon-shape .label rect,#mermaid-svg-exki5Nshd65TMlrQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-exki5Nshd65TMlrQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-exki5Nshd65TMlrQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-exki5Nshd65TMlrQ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
导出缓存
导入缓存
BuildKit 构建器
对象存储 S3
其他构建器
构建直接使用 S3 中的缓存
四、CI/CD 中的集成策略
将分布式缓存嵌入 CI 流水线,需要考虑缓存导入/导出时机和策略。
| 构建前 | docker pull <cache-tag> 或 –cache-from | 从仓库拉取最近的缓存镜像/标签 |
| 构建中 | 使用 BuildKit 缓存挂载和层缓存 | 自动匹配层,命中即跳过 |
| 构建后 | –cache-to type=registry,ref=<cache-tag> 或推送内联缓存 | 将新生成的层和依赖缓存上传 |
| 定时清理 | 设置缓存标签保留策略 | 避免缓存无限膨胀 |
关键实践:
- 使用唯一但稳定的缓存标签,如按分支(cache-develop)或按模块(cache-user-service)区分,避免缓存污染。
- 对主分支进行定时构建,更新缓存,确保缓存热度。
- 在 Kubernetes 中使用 DinD 或 BuildKit DaemonSet,挂载共享 PVC 作为依赖缓存卷。
五、分布式缓存与本地缓存的对比
| 共享范围 | 单节点 | 多节点、多开发者、CI 集群 |
| 命中率 | 仅首次命中好,新节点冷启动为零 | 高,新节点可直接从远程获取预热缓存 |
| 存储成本 | 每个节点独立存储 | Registry 或共享文件系统集中存储,节省空间 |
| 实现复杂度 | 无需额外配置 | 需要 Registry 支持或共享文件系统,配置 CI 导入导出 |
| 网络开销 | 无 | 导入缓存可能需要拉取层元数据,但远比全量下载依赖小 |
六、思维导图总结
#mermaid-svg-PsHXXm2JEQrtd8ju{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PsHXXm2JEQrtd8ju .error-icon{fill:#552222;}#mermaid-svg-PsHXXm2JEQrtd8ju .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PsHXXm2JEQrtd8ju .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PsHXXm2JEQrtd8ju .marker.cross{stroke:#333333;}#mermaid-svg-PsHXXm2JEQrtd8ju svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PsHXXm2JEQrtd8ju p{margin:0;}#mermaid-svg-PsHXXm2JEQrtd8ju .edge{stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .section–1 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section–1 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section–1 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section–1 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section–1 text{fill:#ffffff;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth–1{stroke-width:17;}#mermaid-svg-PsHXXm2JEQrtd8ju .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-0 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-0 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-0 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-0 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-0 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-0{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-0{stroke-width:14;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-1 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-1 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-1 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-1 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-1 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-1{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-1{stroke-width:11;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-2 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-2 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-2 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-2 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-2 text{fill:#ffffff;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-2{stroke-width:8;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-3 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-3 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-3 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-3 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-3 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-3{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-3{stroke-width:5;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-4 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-4 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-4 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-4 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-4 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-4{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-4{stroke-width:2;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-5 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-5 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-5 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-5 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-5 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-5{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-5{stroke-width:-1;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-6 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-6 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-6 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-6 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-6 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-6{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-6{stroke-width:-4;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-7 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-7 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-7 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-7 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-7 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-7{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-7{stroke-width:-7;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-8 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-8 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-8 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-8 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-8 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-8{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-8{stroke-width:-10;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-9 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-9 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-9 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-9 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-9 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-9{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-9{stroke-width:-13;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-10 rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-10 path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-10 circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-10 polygon,#mermaid-svg-PsHXXm2JEQrtd8ju .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-10 text{fill:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .node-icon-10{font-size:40px;color:black;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .edge-depth-10{stroke-width:-16;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled circle,#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:lightgray;}#mermaid-svg-PsHXXm2JEQrtd8ju .disabled text{fill:#efefef;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-root rect,#mermaid-svg-PsHXXm2JEQrtd8ju .section-root path,#mermaid-svg-PsHXXm2JEQrtd8ju .section-root circle,#mermaid-svg-PsHXXm2JEQrtd8ju .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-PsHXXm2JEQrtd8ju .section-root text{fill:#ffffff;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-root span{color:#ffffff;}#mermaid-svg-PsHXXm2JEQrtd8ju .section-2 span{color:#ffffff;}#mermaid-svg-PsHXXm2JEQrtd8ju .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-PsHXXm2JEQrtd8ju .edge{fill:none;}#mermaid-svg-PsHXXm2JEQrtd8ju .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-PsHXXm2JEQrtd8ju :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Docker 构建分布式缓存
目标
跨节点共享层缓存
减少重复依赖下载
加速 CI/CD
层缓存共享
基于 Registry 的 cache tag
type=inline
type=registry
S3
依赖包缓存共享
BuildKit 缓存挂载
NFS/共享卷
sharing=locked
工作流程
构建前 –cache-from 导入
构建中自动匹配
构建后 –cache-to 导出
实践要点
分支级缓存标签
主分支定期构建保持热度
缓存保留策略
使用 BuildKit DaemonSet
掌握分布式构建缓存的理论与实现模式,可以展示出在大规模 Java 微服务构建流水线中优化开发体验和基础设施成本的能力,契合高级面试对系统性架构设计的考察。





