我有一个多阶段 Dockerfile,其中第一阶段是非常计算密集型的,所以我想确保它被缓存。
我创建了一个简单的 Dockerfile 和 docker-compose.yaml 来说明我的意思。 即使我多次重新构建它,也只有第二阶段从缓存中运行。第一阶段总是重建。
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
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
时也需要开始。