亚马逊云科技在ECR中引入远程构建缓存以加速Docker镜像构建
来源: InfoQ - 云计算
亚马逊云科技宣布对其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