一、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目录: