
亚马逊云科技宣布对其 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








评论