37

我最近切换到多阶段 docker 构建,中间构建似乎没有任何缓存。我不确定这是否是 docker 限制,一些不可用的东西,或者我做错了什么。

我正在拉下最终构建并在新构建开始时执行 --cache-from ,但它始终运行完整构建。

4

2 回答 2

42

这似乎是 docker 本身的限制,并在此问题下进行了描述 - https://github.com/moby/moby/issues/34715

解决方法是:

  1. 使用 --target 构建中间阶段
  2. 将中间图像推送到注册表
  3. 使用 --target 构建最终图像并使用多个 --cache-from 路径,列出所有中间图像和最终图像
  4. 将最终图像推送到注册表
  5. 对于后续构建,首先从注册表中拉出中间 + 最终图像
于 2018-10-04T15:01:27.853 回答
10

由于发布了先前的答案,现在有一个使用 BuildKit 后端的解决方案:https ://docs.docker.com/engine/reference/commandline/build/#specifying-external-cache-sources

这涉及将参数传递--build-arg BUILDKIT_INLINE_CACHE=1给您的docker build命令。您还需要通过设置环境变量来确保正在使用 BuildKit DOCKER_BUILDKIT=1(在 Linux 上;我认为在使用最新版本的 Docker Desktop 时,BuildKit 可能是 Windows 上的默认后端)。CI 的完整命令行解决方案可能类似于:

export DOCKER_BUILDKIT=1
# Use cache from remote repository, tag as latest, keep cache metadata
docker build -t yourname/yourapp:latest --cache-from yourname/yourapp:latest --build-arg BUILDKIT_INLINE_CACHE=1 .
# Push new build up to remote repository replacing latest
docker push yourname/yourapp:latest

其他一些评论者正在询问docker-compose. 它也适用于此,尽管您需要另外指定环境变量COMPOSE_DOCKER_CLI_BUILD=1以确保 docker-compose 使用 docker CLI(感谢 BuildKit DOCKER_BUILDKIT=1),然后您可以BUILDKIT_INLINE_CACHE: 1在YAML 文件args:部分的build:部分中进行设置以确保所需--build-arg的是放。

于 2021-07-20T17:37:18.517 回答