首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么docker需要构建之前的所有阶段?

为什么docker需要构建之前的所有阶段?
EN

Stack Overflow用户
提问于 2021-09-07 15:37:17
回答 1查看 61关注 0票数 0

我需要建立2个阶段的基础上,一个共同的

代码语言:javascript
复制
$ 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,但无论如何它都会构建它

代码语言:javascript
复制
$ 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吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-07 16:26:07

docker build有两个不同的后端。“经典”后端的工作方式与您所描述的完全相同:它遍历整个Dockerfile,直到到达最后一个阶段,因此即使某个阶段未使用,它仍然会被执行。较新的BuildKit backend可以执行一些依赖分析,确定某个阶段从未使用过,并根据您的请求跳过该阶段。

非常新的Docker版本使用BuildKit作为默认的后端。稍微老一点的版本提供了BuildKit,但它不是默认的。可以通过运行以下命令来启用它

代码语言:javascript
复制
export DOCKER_BUILDKIT=1

在运行docker build的shell环境中。

(通常最好的做法是在所有环境中运行相同的Docker镜像,并对不同的组件使用不同的Dockerfile。这就避免了任何关于运行哪些阶段的问题。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69091042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档