是否可以缓存多阶段docker构建?

时间:2018-10-04 12:06:27

标签: docker containers dockerfile google-cloud-build

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

我要撤消最终版本,并在新版本开始时执行--cache-,但是它始终会运行完整版本。

2 个答案:

答案 0 :(得分:9)

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

解决方法是:

  1. 使用--target构建中间阶段
  2. 将中间图像推送到注册表中
  3. 使用--target构建最终图像,并使用多个--cache-from路径,列出所有中间图像和最终图像
  4. 将最终图像推送到注册表中
  5. 对于后续构建,请先从注册表中拉取中间+最终映像

答案 1 :(得分:0)

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

这涉及将参数 --build-arg BUILDKIT_INLINE_CACHE=1 传递给您的 docker build 命令。您还需要通过设置环境变量 DOCKER_BUILDKIT=1 来确保正在使用 BuildKit(在 Linux 上;我认为 BuildKit 可能是 Windows 上使用最新版本的 Docker Desktop 时的默认后端)。 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(由于 DOCKER_BUILDKIT=1 使用 BuildKit),然后您可以设置 BUILDKIT_INLINE_CACHE: 1在 YAML 文件的 args: 部分的 build: 部分中,以确保设置了所需的 --build-arg