如何使用 CI 提取/重用 Docker BuildKit 缓存

问题描述

Docker 引入了 RUN --mount=type=cache,我可以在本地很好地工作,但我希望能够在 CI 中利用它,特别是 Azure Devops。

但我找不到 saveload 构建之间缓存的方法。有没有办法做到这一点?

解决方法

请参考this doc

在 Microsoft 托管代理的当前设计中,每个作业都被分派到新配置的虚拟机(基于从 azure-pipelines-image-generation 存储库模板生成的映像)。这些虚拟机在作业完成后会被清除,不会被保留,因此无法为后续作业重用。虚拟机的短暂特性阻止了缓存的 Docker 层的重用。

因此,当您使用 Microsoft 托管代理时,VM 上的本地 docker 缓存不能被其他构建使用。

这里有一些替代方法:

  1. 您可以使用 self-hosted agent 来执行 docker 构建过程。多个构建可以共享本地缓存。

  2. 您也可以使用 Cache taskdocker save/load commonds 将保存的 docker 层上传到 azure devops 服务器并在以后运行时恢复。

  3. 使用 docker pull 从远程仓库拉取镜像。使用 --cache-from 指向图像。您可以将构建映像推送到远程存储库以供下次构建。

您可以参考 this blogthis ticket 了解更多详细信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...