使 docker-compose 使用多阶段构建的缓存?

时间:2020-12-27 09:49:56

标签: docker docker-compose

我有一个多阶段 Dockerfile,其中第一阶段是非常计算密集型的,所以我想确保它被缓存。

我创建了一个简单的 Dockerfile 和 docker-compose.yaml 来说明我的意思。 即使我多次重新构建它,也只有第二阶段从缓存中运行。第一阶段总是重建。

Dockerfile

FROM node:15.4 as build-stage
RUN sleep 5
RUN touch /test

# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1.17-alpine
COPY --from=build-stage /test /test

docker-compose.yaml

version: '3'

services:
  myservice:
    build:
      context: ./
      cache_from:
        - myservice:latest
        - myservice:build-stage
    image: myservice:latest

在这里执行docker-compose build后,我可以看到以下图像

REPOSITORY   TAG           IMAGE ID       CREATED          SIZE
myservice    latest        ae96394ac660   15 seconds ago   19.9MB
<none>       <none>        d4c212c2bcd1   15 seconds ago   936MB
node         15.4          6f7f341ab8b8   9 days ago       936MB
nginx        1.17-alpine   89ec9da68213   8 months ago     19.9MB

人们可以假设名为 <none> 的那个是 build-stage 图像。但由于它没有标记,我无法使 cache_from 工作。

如果我只使用 docker 而不是 docker-compose 我会这样做: docker build . --target build-image -t myservice:build-image 这将只构建第一阶段并标记它,以便它可以在之后用作缓存。但这可以通过 docker-compose 实现吗? 我的意思是,docker-compose.yaml 中有一个 target: 选项,但是如果我添加一个单独的服务来构建和标记第一阶段,那么在我执行 docker-compose up 时也需要开始。

0 个答案:

没有答案