Dockerfile 不执行第二阶段
Dockerfile not executing second stage
我从 Docker 那里得到了一些奇怪的行为,但我在任何地方都找不到它。它似乎是随机跳过阶段,即使是多阶段 Docker 我只是从网上论坛复制粘贴的文件。
我的 dockerfile 是:
FROM alpine as base
RUN echo "1"
# SKIPPED
FROM base as mid
RUN echo "2"
FROM base as final
RUN echo "3"
输出:
docker build -t test .\ --no-cache
[+] Building 2.0s (7/7) FINISHED
=> [internal] load .dockerignore 0.0s
=> => transferring context: 34B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 143B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 1.3s
=> CACHED [base 1/2] FROM docker.io/library/alpine@sha256:... 0.0s
=> [base 2/2] RUN echo "1" 0.3s
=> [final 1/1] RUN echo "3" 0.4s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:... 0.0s
=> => naming to docker.io/library/... 0.0s
这是什么原因造成的?
Buildkit 使用依赖图。它查看目标阶段,默认情况下是最后一个阶段:
FROM base as final
RUN echo "3"
从那里它看到需要 base
来构建这个阶段,所以它拉入了基础阶段:
FROM alpine as base
RUN echo "1"
到此为止,无需构建中间阶段即可创建目标图像。 FROM
或 COPY --from
中没有需要它的依赖项。此行为不同于经典的 docker 构建,它按顺序执行步骤直到达到目标阶段,这也是 buildkit 更快的原因之一。
我从 Docker 那里得到了一些奇怪的行为,但我在任何地方都找不到它。它似乎是随机跳过阶段,即使是多阶段 Docker 我只是从网上论坛复制粘贴的文件。
我的 dockerfile 是:
FROM alpine as base
RUN echo "1"
# SKIPPED
FROM base as mid
RUN echo "2"
FROM base as final
RUN echo "3"
输出:
docker build -t test .\ --no-cache
[+] Building 2.0s (7/7) FINISHED
=> [internal] load .dockerignore 0.0s
=> => transferring context: 34B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 143B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 1.3s
=> CACHED [base 1/2] FROM docker.io/library/alpine@sha256:... 0.0s
=> [base 2/2] RUN echo "1" 0.3s
=> [final 1/1] RUN echo "3" 0.4s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:... 0.0s
=> => naming to docker.io/library/... 0.0s
这是什么原因造成的?
Buildkit 使用依赖图。它查看目标阶段,默认情况下是最后一个阶段:
FROM base as final
RUN echo "3"
从那里它看到需要 base
来构建这个阶段,所以它拉入了基础阶段:
FROM alpine as base
RUN echo "1"
到此为止,无需构建中间阶段即可创建目标图像。 FROM
或 COPY --from
中没有需要它的依赖项。此行为不同于经典的 docker 构建,它按顺序执行步骤直到达到目标阶段,这也是 buildkit 更快的原因之一。