写点什么

亚马逊云科技在 ECR 中引入远程构建缓存以加速 Docker 镜像构建

作者:Craig Risi

  • 2025-11-21
    北京
  • 本文字数:1883 字

    阅读完需:约 6 分钟

大小:948.84K时长:05:23
亚马逊云科技在ECR中引入远程构建缓存以加速Docker镜像构建

亚马逊云科技宣布对其 CodeBuild 服务进行增强,允许团队使用 Amazon ECR(Elastic Container Registry)作为远程 Docker 层缓存,显著减少 CI/CD 管道中的镜像构建时间。组织可以利用 ECR 仓库持久化和在运行之间复用构建层的能力,跳过重建容器的未更改部分并加速交付。

 

博客概述了Docker BuildKit支持如何使---cache-from 和---cache-to 等命令指向基于 ECR 的缓存镜像,允许 CodeBuild 启动的构建从先前的运行中拉取缓存层,并将更新的缓存层推回到 ECR。结果,当基础层保持不变时,重建可以跳过 Dockerfile 中的大部分内容,改善开发者反馈循环并减少构建资源消耗。

 

亚马逊云科技强调这种方法解决了基于容器的 CI/CD 的主要瓶颈之一:主要来自重复构建重依赖层的漫长重建时间。远程缓存模型补充了现有的本地缓存选项,并提供了一个更可靠、全局的缓存,跨越频繁构建和多个代理。

 

要实现该解决方案,用户需要配置他们的构建管道,将代表缓存的镜像(通常使用单独的标签)推送到 ECR,然后在后续构建中引用它。随着时间的推移,随着缓存的积累,构建持续时间显著下降,因为 Docker 引擎绕过了未更改的层。亚马逊云科技指出,缓存的有效性取决于变更如何通过 Dockerfile 传播以及缓存结构的优劣;多阶段构建和层排序等优化会增强收益。

 

设置很简单。开发者创建一个 ECR 仓库来存储缓存的镜像层,授予 CodeBuild 权限以推送和拉取,以及在他们的构建环境中启用 BuildKit。从那里开始,CodeBuild 可以在构建新层之前自动从 ECR 拉取先前构建的层,并在构建完成后将更新的缓存层推回到 ECR。这个过程大大减少了冗余重建,提高了构建效率和开发者生产力。

 

一个典型的配置涉及在项目的 buildspec.yml 中定义环境变量和命令。在预构建阶段,CodeBuild 与 ECR 进行身份验证,并在后者存在时拉取缓存镜像。构建阶段运行 Docker,启用 BuildKit,指定 ECR 缓存作为层复用的源和目的地。在后构建阶段,更新的缓存层被推回到 ECR,以供将来构建使用。

 

根据这篇博客文章,早期采用者报告了大量节省时间,以前需要 10-15 分钟的构建现在在缓存复用较高时不到五分钟就完成了。一个用户发文介绍了他们将构建时间从 6 分钟减少到 2 分钟的经历,这就是这个新功能的成果。对于依赖大型依赖层或多阶段 Docker 构建的项目,改进尤其明显。亚马逊云科技指出,最佳性能取决于一致的 Dockerfile 层排序和频繁的缓存刷新,以避免陈旧的依赖。

 

这种方法使亚马逊云科技与更广泛的行业趋势保持一致,即更智能的缓存和可重现的构建。竞争者的 CI/CD 提供商,如 GitHub Actions 和 GitLab CI,也提供远程缓存解决方案,GitHub 通过其 Actions Cache 服务,GitLab 通过基于注册表的缓存,但亚马逊云科技与 ECR 和 BuildKit 的集成提供了一个更本地化、云优化的工作流程。

 

通过将 Docker 的本地缓存能力直接集成到其托管的构建环境中,亚马逊云科技继续简化开发者体验,为云原生团队带来更快、更可靠的构建。对于运行大型容器化负载的组织来说,这种增强代表了朝着更高效、成本效益更高的 CI/CD 管道迈出的重要一步。

 

总体而言,这次更新为寻求提高管道速度和资源效率的开发团队提供了一个实用的杠杆,特别是在容器密集型组织中。通过复用存储在 ECR 中的缓存层,亚马逊云科技 CodeBuild 用户可以缩短周转时间,降低计算成本,并提高构建可靠性。

 

亚马逊云科技并非唯一采用这种加速 Docker 镜像构建的方法,谷歌和微软也提供了类似的服务:

 

谷歌的 Cloud Build支持容器构建和 Buildpacks 的远程缓存镜像。例如,当使用 buildpacks 时,你可以指定一个--cache-image 标志指向一个存储库,如 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/CACHE_IMAGE_NAME:latest,以复用先前的构建结果。此外,Cloud Build 的文档建议使用--cache-from 进行 Docker 构建,以利用存储在注册表中的缓存层。这些功能和亚马逊云科技使用远程注册表作为缓存的概念类似,尽管谷歌强调的是 Buildpacks 和基于注册表的缓存镜像,而不是构建服务本身内置的专用“镜像层缓存”机制。

 

微软的 Azure Pipelines 支持各种构建工件和依赖项的缓存,但就容器层缓存而言,用户社区反馈表明其存在局限性。在自托管代理上,你可以实现 Docker 的--cache-from 策略,并管理你自己的缓存层注册表,但在微软托管的代理上,体验可能脆弱或效率较低。Reddit 上的一位用户观察到:

 

"Azure Pipelines 构建管道支持多阶段 Docker 镜像的缓存功能……下载缓存抵消了我们从缓存中获得的所有好处"

 

简而言之,尽管 Azure 支持在管道中进行缓存任务,但与基于自定义注册表的缓存工作流相比,Docker 层复用的端到端流程还不够成熟。

 

原文链接:AWS Introduces Remote Build Cache in ECR to Accelerate Docker Image Builds

2025-11-21 13:001

评论

发布
暂无评论

Mybatis执行流程浅析(附深度文章推荐&面试题集锦)

Kerwin

Java mybatis

设计模式总篇:从为什么需要原则到实际落地(附知识图谱)

Kerwin

Java 设计模式

疫情年逆风翻盘

Kerwin

程序员

week6 总结

不在调上

关于如何判断一个list是否为空的思考

Leetao

Python Python基础知识 列表

6种快速统计代码执行时间的方法,真香!

王磊

Java

nginx在重定向时端口出错的问题

烫烫烫个喵啊

nginx

【计算机网络】你需要知道的链路层知识

烫烫烫个喵啊

计算机网络 链路层 交换机

纯CSS实现自定义单选框和复选框

爱嘤嘤嘤斯坦

CSS Java 编程语言 标签

Docker网络学习第一篇:Linux虚拟网络

Lazy

Docker Linux 网络

Elasticsearch从入门到放弃:再聊搜索

Jackey

elasticsearch

Java8——方法引用

Java旅途

java8 方法引用

Docker网络学习第二篇-认识iptables

Lazy

Docker Linux 网络

30岁+程序员职场攻略:找到自己的“职业锚”乘风破浪

华为云开发者联盟

程序员 AI 开发者 职场

因为 Django ORM update,我今天差点「从删库到跑路」

AlwaysBeta

数据库 django 编程 程序员

开发框架文档体系化的思考

vivo互联网技术

框架开发

当我们在谈架构时,我们谈的是什么?

冯文辉

架构 企业架构 系统架构

程序员的时间管理

Kerwin

程序员

没内鬼,来点干货!volatile和synchronized

Kerwin

Java volatile synchronized

秒懂云通信:通信圈黑话大盘点

阿里云Edge Plus

云通信 通信云

Hello!GitHub 好用好玩值得收藏的开源项目集合~

Kerwin

开源

日记一则

progyoung

前端杂记-&&和||

阡陌r

JavaScript && ||

6 个珍藏已久 IDEA 小技巧,这一波全部分享给你!

楼下小黑哥

Java IDEA

简述 CAP 原理

不在调上

redis系列之——一致性hash算法

诸葛小猿

redis 一致性hash redis集群

没内鬼,来点干货!SQL优化和诊断

Kerwin

MySQL

一张PDF了解JDK10 GC调优秘籍-附PDF下载

程序那些事

Java jdk JVM GC JDK10

5万字、97 张图总结操作系统核心知识点

苹果看辽宁体育

操作系统 计算机

ARTS - Week 5

Khirye

ARTS 打卡计划

SpringBoot代码生成器

Kerwin

Java 开源

亚马逊云科技在ECR中引入远程构建缓存以加速Docker镜像构建_云计算_InfoQ精选文章