【问题标题】:How do I reuse the cache from a `RUN --mount=type=cache` docker build?如何重用来自 `RUN --mount=type=cache` docker build 的缓存?
【发布时间】:2020-06-12 08:16:29
【问题描述】:

我正在使用新的实验性 docker buildkit 语法进行多阶段构建,如下所示:

Dockerfile:

RUN --mount=type=cache,target=/home/build/.build-cache,gid=1000,uid=1001 ./build

重击:

DOCKER_BUILDKIT=1 docker build .

在本地效果很好。在 CI 上,我每次都会得到一个新的 docker 环境,所以没有缓存。

我可以将文件导出和导入到环境中,但我不知道缓存在哪里。有什么想法吗?

或者我应该通过一些 docker 命令导出/导入缓存吗?我已经阅读了https://docs.docker.com/engine/reference/commandline/build/#specifying-external-cache-sourceshttps://github.com/moby/buildkit#export-cache,但我不清楚哪个是特定于 buildkit,哪个特定于 docker,或者是否真的适用于安装到 Dockerfile RUN 命令中的这个缓存。

我在这里添加了一个失败的测试的公开要点,证明了我的期望: https://gist.github.com/Mahoney/85e8549892e0ae5bb86ce85339db1a71/6308f1bdb062a8982017193b96d61ec00a7698c5

这个后来的修订工作,但我不满意 - 太多的引导: https://gist.github.com/Mahoney/85e8549892e0ae5bb86ce85339db1a71

【问题讨论】:

  • 您可以使用带有 docker 的 buildx,例如 docker buildx build ...,并在最终映像中从注册表、文件系统或 docker inline 导出/导入层缓存。 medium.com/titansoft-engineering/…github.com/docker/buildx 有更多信息。
  • 谢谢,我会复习的——我觉得一定有我遗漏的东西。
  • 只是跟进这个问题 - 问题是在多项目构建中使用 gradle,层缓存不是那么有用,因为我几乎必须做一个COPY . .,吹走所有每次发生任何变化时进行层缓存。有一些方法可以从层缓存中获益,但维护起来很痛苦。共享 gradle 用户主目录在某种程度上是最明智的缓存方式。

标签: docker dockerfile docker-buildkit


【解决方案1】:

似乎没有任何方法可以从通用 docker 工作文件中提取此特定缓存。

不过,您当然可以备份整个/var/lib/docker。这不适用于 CircleCI 的远程 docker 引擎,因为您没有 sudo 访问权限,但适用于您有权限的 GitHub Actions。

请参阅此处以获取示例: https://github.com/Mahoney-playground/docker-cache-action

【讨论】:

  • buildkit 团队提出了一个问题,因此实现的机会比正常情况要好,可以控制挂载为缓存目录的主机目录:github.com/moby/buildkit/issues/1512
  • 现在有如果你使用docker buildx build
猜你喜欢
  • 2020-01-18
  • 2022-01-07
  • 2021-11-26
  • 2020-08-11
  • 2021-09-29
  • 2023-03-07
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多