我为什么要使用docker ONBUILD? 1.场景与ONBUILD 基本Dockerfile

我为什么要使用docker ONBUILD? 1.场景与ONBUILD 基本Dockerfile,docker,dockerfile,docker-build,Docker,Dockerfile,Docker Build,显然,当我们在Dockerfile(testimage:latest)上面构建时,副本不会受到影响。(未复制test.py) 现在开始构建Dockerfile 现在,当我们在上面构建Dockerfile时,COPY将影响,copiestest.py 2.无ONBUILD的场景 我不需要使用ONBUILD 基本Dockerfile 上面的Dockerfile构建具有python3的docker映像(test-image2:latest) 现在,子docker图像Dockerfile 所以,我的问题

显然,当我们在
Dockerfile
testimage:latest
)上面构建时,
副本不会受到影响。(未复制
test.py

现在开始构建
Dockerfile
现在,当我们在上面构建
Dockerfile
时,
COPY
将影响,copies
test.py

2.无
ONBUILD的场景
我不需要使用
ONBUILD

基本
Dockerfile
上面的
Dockerfile
构建具有
python3
的docker映像(
test-image2:latest

现在,子docker图像
Dockerfile

所以,我的问题是,为什么我应该使用
ONBUILD
,或者什么时候应该使用?是否存在性能差异

我认为答案很简单:当您的基本映像必须用于各种儿童时,您希望使用“on build”,因此您(1)避免重复,并且(2)约束映像的用户使用“test.py”复制。

一般来说,您根本不应该使用ONBUILD。让第行后面的Dockerfile做一些事情,而不是简单地合并其内容,这违反了最小意外的原则

如果您试图在构建时执行的是类似于RUN或ENV指令的操作,那么从语义上讲,无论您是在基本映像中还是在派生映像中执行,都没有区别。如果在基本映像中执行此操作(一次,而不是每次生成派生映像一次),则效率会更高

如果你想复制。。。然后,您试图在运行
docker build
时将特定文件强制放在主机系统上,这对于使用者来说有点奇怪。Docker注释

在将
ADD
COPY
放入
ONBUILD
时要小心。如果新构建的上下文缺少要添加的资源,“onbuild”映像将灾难性地失败。如上所述,通过允许
Dockerfile
作者进行选择,添加一个单独的标记有助于缓解这种情况

正如该页面所指出的,如果您必须使用ONBUILD,那么应该在image标记中调用它,这样当您从该图像构建Dockerfile时,就可以清楚地看到,发生了一些奇怪的事情。大多数当前的Docker Hub映像根本没有
-onbuild
变体,即使这样的东西通常有非常公式化的用途

FROM ubuntu:latest
RUN apt-get update && apt-get install python3

ONBUILD COPY test.py test.py
FROM test-image:latest
FROM ubuntu:latest
RUN apt-get update && apt-get install python3
FROM test-image2:latest
COPY test.py /test.py