【问题标题】:Why isn't docker reusing docker-compose's cache layers?为什么 docker 不重用 docker-compose 的缓存层?
【发布时间】:2020-05-15 19:57:46
【问题描述】:

这是我在使用更大的 Dockerfile 时遇到的问题的简化示例。

这是Dockerfile

FROM alpine:latest AS base
COPY docker-compose.yml /tmp/docker-compose.yml
RUN touch /tmp/foo

这是docker-compose.yml

version: '3.5'
services:
  web:
    build:
      context: .

我期望docker build 能够重用docker-compose 构建的缓存层。我在运行docker-compose build web 时看到的是:

  $ docker-compose build web
Building web
Step 1/3 : FROM alpine:latest AS base
 ---> f70734b6a266
Step 2/3 : COPY docker-compose.yml /tmp/docker-compose.yml
 ---> 764c54eb3dd4
Step 3/3 : RUN touch /tmp/foo
 ---> Running in 77bdf96af899
Removing intermediate container 77bdf96af899
 ---> 7d8197f7004f

Successfully built 7d8197f7004f
Successfully tagged docker-compose-caching_web:latest

如果我重新运行docker-compose build web,我会得到:

...
Step 2/3 : COPY docker-compose.yml /tmp/docker-compose.yml
 ---> Using cache
 ---> 764c54eb3dd4
...

所以它显然能够缓存包含文件的图层。但是,当我运行 docker build . 时,我看到的输出如下:

  $ docker build .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM alpine:latest AS base
 ---> f70734b6a266
Step 2/3 : COPY docker-compose.yml /tmp/docker-compose.yml
 ---> e8679333ba0d
Step 3/3 : RUN touch /tmp/foo
 ---> Running in af26cc65312d
Removing intermediate container af26cc65312d
 ---> 186c8341ee96
Successfully built 186c8341ee96

注意第 2 步并非来自缓存。为什么不?或者,更重要的是,如果不使用--cache-from,我怎样才能确保它可以运行?

这导致的问题是,在我没有显示的更大 Dockerfile 中的这一步之后,有一个很棒的 RUN 命令需要一段时间才能运行。如何让docker builddocker-compose build 共享缓存层?

(OS X 10.14.6 上的 Docker Desktop v 2.3.0.2 (45183) 适合在家玩的人)

【问题讨论】:

  • sudo docker-compose up --build 怎么样?您确定每次运行这些build 时您的Dockerfile 都没有变化吗?\

标签: docker docker-compose dockerfile


【解决方案1】:

使用Docker-compose 1.25+ (Dec. 2019),尝试使用:

COMPOSE_DOCKER_CLI_BUILD=1 docker-compose build

这是启用 docker-cli 所需要的,而不是自己的内部 docker-compose 构建。

另见“Faster builds in Docker Compose 1.25.1 thanks to BuildKit Support”。
但请注意docker-compose issue 7336,在与DOCKER_BUILDKIT=1 一起使用时(除了COMPOSE_DOCKER_CLI_BUILD=1

【讨论】:

    【解决方案2】:

    看起来像一个已知问题。由于我不完全理解的原因,docker compose build 生成的哈希值与docker build 生成的哈希值不同。

    https://github.com/docker/compose/issues/883

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 2016-10-24
      • 2022-07-05
      • 2021-09-25
      相关资源
      最近更新 更多