我需要建立2个阶段的基础上,一个共同的
$ ls
Dockerfile dev other prod
$ cat Dockerfile
FROM scratch as dev
COPY dev /
FROM scratch as other
COPY other /
FROM scratch as prod
COPY --from=dev /env /
COPY prod /正如您所看到的,prod stage并不依赖于other stage,但无论如何它都会构建它
$ docker build . --target prod
Sending build context to Docker daemon 4.096kB
Step 1/7 : FROM scratch as dev
--->
Step 2/7 : COPY dev /
---> 64c24f1f1d8c
Step 3/7 : FROM scratch as other
--->
Step 4/7 : COPY other /
---> 9b0753ec4353
Step 5/7 : FROM scratch as prod
--->
Step 6/7 : COPY --from=dev /dev /
---> Using cache
---> 64c24f1f1d8c
Step 7/7 : COPY prod /
---> 9fe8cc3d3ac1
Successfully built 9fe8cc3d3ac1为什么Docker需要构建other层?
没有other,我如何构建prod?我必须使用另一个Dockerfile吗?
发布于 2021-09-07 16:26:07
docker build有两个不同的后端。“经典”后端的工作方式与您所描述的完全相同:它遍历整个Dockerfile,直到到达最后一个阶段,因此即使某个阶段未使用,它仍然会被执行。较新的BuildKit backend可以执行一些依赖分析,确定某个阶段从未使用过,并根据您的请求跳过该阶段。
非常新的Docker版本使用BuildKit作为默认的后端。稍微老一点的版本提供了BuildKit,但它不是默认的。可以通过运行以下命令来启用它
export DOCKER_BUILDKIT=1在运行docker build的shell环境中。
(通常最好的做法是在所有环境中运行相同的Docker镜像,并对不同的组件使用不同的Dockerfile。这就避免了任何关于运行哪些阶段的问题。)
https://stackoverflow.com/questions/69091042
复制相似问题