我们在 Blacksmith 看到的大多数 GitHub Action 工作流程都使用了 Docker。无论是设置容器以运行测试,还是构建自定义 Docker 映像并将其推送到注册表,Docker 无处不在。众所周知,对于一个健康的持续集成(CI)管道来说,必须考虑有效的缓存策略--没有什么事情比每次运行时看着测试重建无差别的依赖关系更让人头疼的了。

几周前,我在帮助一位客户设置他们的 Docker 工作流时,开始阅读有关在 GitHub Actions 中启用缓存的最佳方法。出乎意料的是,我发现至少有三种方法可以实现这一点,每种方法都有自己的怪癖。这篇博客一站式地介绍了我所学到的所有知识,并将帮助你为工作流程选择最合适的缓存策略。

Docker 缓存 101

Docker 镜像最好可视化为一层层的堆栈,其中每一层代表 Dockerfile 中的指令导致的一组文件系统变化。每一层只包含前一层的更改。这就确保了各层之间的数据不会重复。分层结构的一大优势是,中间文件系统(层)可以在后续的 Docker 构建中重复使用。这种层的重复使用构成了 Docker 缓存的基础,并能以更快的速度增量构建,而不是总是从头开始构建镜像。

最好的 Dockerfile 是按照从最不常变异到最常变异的顺序堆叠层的文件。将最不可能发生变化的层整合为每个 Docker 构建的基础,可以在构建后续 Docker 镜像时最有效地重复使用层。关于 Dockerfile 的最佳实践,有几篇更为详尽的博客,我就不多说了。

从简单开始

如果你熟悉 GitHub Actions 中 Docker 构建和推送步骤的编写方式,请随意跳到下一节有关缓存的内容。

name:在上构建并推送 Docker Image:

 push:

 branches:- main jobs:

 build-and-push:

 运行于: ubuntu-latest

 步骤:- 名称: 签出代码