为什么要使用 docker ONBUILD?
Why should I use docker ONBUILD?
1。场景和ONBUILD
基地Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install python3
ONBUILD COPY test.py test.py
显然,当我们在 Dockerfile
(test-image:latest
) 之上构建时,COPY
不会受到影响。(test.py
未复制)
正在建设中Dockerfile
FROM test-image:latest
现在,当我们在 Dockerfile
之上构建时,COPY
会影响,复制 test.py
2。没有 ONBUILD
的场景
我不用使用就达到了同样的效果ONBUILD
基地Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install python3
在 Dockerfile
上方构建 docker 图像,其中包含 python3
(test-image2:latest
)
现子docker图片Dockerfile
FROM test-image2:latest
COPY test.py /test.py
所以,我的问题是,我为什么要使用 ONBUILD
或者什么时候应该使用?有什么性能差异
我认为答案很简单:当您的父图像必须用于各种子图像时,您想使用 ONBUILD
,所以您
- 避免重复
- contstrain 要
test.py
复制图像的用户
一般来说,您根本不应该使用 ONBUILD。让后面的 Dockerfile FROM 行做一些事情而不是简单地合并它的内容违反了最小惊喜原则。
如果您尝试在 ONBUILD 上执行的操作类似于 运行 或 ENV 指令,那么从语义上讲,无论您是在基础映像中还是在派生映像中执行它都没有区别。如果你在基础镜像中这样做会更有效率(一次,而不是每次构建派生镜像时一次)。
如果您正在尝试 ONBUILD COPY ... 那么您是在尝试将特定文件强制 在主机系统 上 运行 docker build
,作为消费者来说有点奇怪。 Docker 的 Best practices for writing Dockerfiles 注释
Be careful when putting ADD
or COPY
in ONBUILD
. The “onbuild” image fails catastrophically if the new build’s context is missing the resource being added. Adding a separate tag, as recommended above, helps mitigate this by allowing the Dockerfile
author to make a choice.
如该页面所述,如果您必须使用 ONBUILD,则应在图像标记中调用它,以便在您从该图像构建 Docker 文件时清楚地知道发生了一些奇怪的事情。大多数当前 Docker Hub 图像根本没有 -onbuild
变体,即使对于 tomcat 这样通常具有极其公式化用途的东西也是如此。
1。场景和ONBUILD
基地Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install python3
ONBUILD COPY test.py test.py
显然,当我们在 Dockerfile
(test-image:latest
) 之上构建时,COPY
不会受到影响。(test.py
未复制)
正在建设中Dockerfile
FROM test-image:latest
现在,当我们在 Dockerfile
之上构建时,COPY
会影响,复制 test.py
2。没有 ONBUILD
的场景
我不用使用就达到了同样的效果ONBUILD
基地Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install python3
在 Dockerfile
上方构建 docker 图像,其中包含 python3
(test-image2:latest
)
现子docker图片Dockerfile
FROM test-image2:latest
COPY test.py /test.py
所以,我的问题是,我为什么要使用 ONBUILD
或者什么时候应该使用?有什么性能差异
我认为答案很简单:当您的父图像必须用于各种子图像时,您想使用 ONBUILD
,所以您
- 避免重复
- contstrain 要
test.py
复制图像的用户
一般来说,您根本不应该使用 ONBUILD。让后面的 Dockerfile FROM 行做一些事情而不是简单地合并它的内容违反了最小惊喜原则。
如果您尝试在 ONBUILD 上执行的操作类似于 运行 或 ENV 指令,那么从语义上讲,无论您是在基础映像中还是在派生映像中执行它都没有区别。如果你在基础镜像中这样做会更有效率(一次,而不是每次构建派生镜像时一次)。
如果您正在尝试 ONBUILD COPY ... 那么您是在尝试将特定文件强制 在主机系统 上 运行 docker build
,作为消费者来说有点奇怪。 Docker 的 Best practices for writing Dockerfiles 注释
Be careful when putting
ADD
orCOPY
inONBUILD
. The “onbuild” image fails catastrophically if the new build’s context is missing the resource being added. Adding a separate tag, as recommended above, helps mitigate this by allowing theDockerfile
author to make a choice.
如该页面所述,如果您必须使用 ONBUILD,则应在图像标记中调用它,以便在您从该图像构建 Docker 文件时清楚地知道发生了一些奇怪的事情。大多数当前 Docker Hub 图像根本没有 -onbuild
变体,即使对于 tomcat 这样通常具有极其公式化用途的东西也是如此。