zoukankan      html  css  js  c++  java
  • 14.dockerfile之ONBUILD指令

    一、ONBUILD指令说明


    1.ONBUILD指令可以为镜像添加触发器(trigger),参数可以是任意一个dockerfile文件中的指令;

    2.在一个dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响;但是当我们编写一个新的dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。需要注意的是,如果是再利用B镜像构造新的镜像时,那个ONBUILD指令就无效了,也就是说只能再构建子镜像中执行,对孙子镜像构建无效。因为在构建子镜像中已经执行了,如果孙子镜像构建还要执行,相当于重复执行,这就有问题了。利用ONBUILD指令,实际上就是相当于创建一个模板镜像,后续可以根据该模板镜像创建特定的子镜像,需要在子镜像构建过程中执行的一些通用操作就可以在模板镜像对应的dockerfile文件中用ONBUILD指令指定。 从而减少dockerfile文件的重复内容编写。

    说白了就是:

    dockerfileA中有ONBUILD指令,通过dockerfileA构建出imageA镜像,这时dockerfileA中的ONBUILD并不会对imageA产生任何影响;

    这时,我们再编写一个dockerfileB文件,该文件以上面的dockerfileA构建的镜像作为基础镜像,那么通过dockerfileB构建镜像imageB时,dockerfileA中的ONBUILD指令就生效了,首先先执行dockerfileA中的ONBUILD指令,才会执行dockerfileB中的指令;

    我们在编写一个dockerfileC文件,该文件以上面的dockerfileB构建的镜像imageB为基础镜像,那么通过dockerfileC构建镜像imageC时,dockerfileA中的ONBUILD指令不再生效,因为在构建imageB时已经执行过一次了。

     二、ONBUILD指令案例


    首先,编写第一个dockerfile:

    #base image
    FROM centos
    
    #MAINTAINER,this dockerfile creater
    MAINTAINER loose@docker.com
    
    #ONBUILD指令,我们创建一个目录
    ONBUILD RUN mkdir onbuild

    其次,构建镜像:

    最后查看镜像:

    第一个镜像构建好了,我们开始编写第二个dockerfile:

    #base image
    FROM onbuild:v1.0  //以刚刚构建的镜像为基础镜像
    
    #MAINTAINER,this dockerfile creater
    MAINTAINER loose@docker.com

    根据dockerfile构建镜像并查看构建日志:

    最后,我们进入onbuild:v2.0的交互模式,查看是否创建了onbuild目录:

  • 相关阅读:
    关于重构之Switch的处理【二】
    转,有用
    C#枚举总结和其扩展用法(通过枚举描设置枚举值)
    DataGridView编辑状态和CurrentCellDirtyStateChanged
    C#获取DataGirdView选定子项子控件类型,is,as的用法
    VS2013添加作者注释(C#工程)
    开通博客了 zkh
    CentOS7下在线安装mysql zkh
    设计模式之简单工厂,工厂方法,抽象工厂模式(二) zkh
    asp.net mvc中捕获异常和使用log4net日志记录组件 zkh
  • 原文地址:https://www.cnblogs.com/Json1208/p/8975402.html
Copyright © 2011-2022 走看看