【发布时间】: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-sources 和https://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