为什么要使用 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,所以您

  1. 避免重复
  2. contstraintest.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 这样通常具有极其公式化用途的东西也是如此。