【问题标题】:Why should I use docker ONBUILD?为什么要使用 docker ONBUILD?
【发布时间】:2020-06-04 18:18:40
【问题描述】:

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之上构建具有python3test-image2:latest)的docker镜像

现在子 docker 镜像Dockerfile

FROM test-image2:latest
COPY test.py /test.py

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

【问题讨论】:

    标签: docker dockerfile docker-build


    【解决方案1】:

    我认为答案很简单:当你的父图像必须用于各种子图像时,你想使用ONBUILD,所以你

    1. 避免重复
    2. 约束图片的用户复制test.py

    【讨论】:

      【解决方案2】:

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

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

      如果您尝试 ONBUILD COPY ... 那么您尝试在运行 docker build 时强制将特定文件在主机系统上,这有点作为消费者很奇怪。 Docker 的Best practices for writing Dockerfiles 笔记

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

      正如该页面所指出的,如果您必须使用 ONBUILD,则应在映像标记中调用它,以便在从该映像构建 Dockerfile 时清楚地知道,发生了一些奇怪的事情。大多数当前的 Docker Hub 映像根本没有 -onbuild 变体,即使对于像 tomcat 这样的通常具有极其公式化用途的东西也是如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-06
        • 2020-04-26
        • 1970-01-01
        • 1970-01-01
        • 2022-12-07
        • 2018-12-15
        • 2021-08-23
        • 1970-01-01
        相关资源
        最近更新 更多