docker学习笔记17:Dockerfile 指令 ONBUILD介绍

ONBUILD指令能够为镜像添加触发器。其参数是任意一个Dockerfile 指令。docker

当咱们在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(好比为A镜像)不会产生实质性影响。ubuntu

可是当咱们编写一个新的Dockerfile文件来基于A镜像构建一个镜像(好比为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程当中,首先会执行ONBUILD指令指定的指令,而后才会执行其它指令。bash

须要注意的是,若是是再利用B镜像构造新的镜像时,那个ONBUILD指令就无效了,也就是说只能再构建子镜像中执行,对孙子镜像构建无效。其实想一想是合理的,由于在构建子镜像中已经执行了,若是孙子镜像构建还要执行,至关于重复执行,这就有问题了。ui

利用ONBUILD指令,实际上就是至关于建立一个模板镜像,后续能够根据该模板镜像建立特定的子镜像,须要在子镜像构建过程当中执行的一些通用操做就能够在模板镜像对应的dockerfile文件中用ONBUILD指令指定。 从而减小dockerfile文件的重复内容编写。spa

 

咱们来看一个简单例子。3d

一、先编写一个Dockerfile文件,内容以下:日志

#test
FROM ubuntu
MAINTAINER hello
ONBUILD RUN mkdir mydir

利用上面的dockerfile文件构建镜像: docker build -t imagea .
利用imagea镜像建立容器: docker run --name test1 -it imagea /bin/bashcode

咱们发现test1容器的根目录下并无mydir目录。说明ONBUILD指令指定的指令并不会在本身的构建中执行。blog

二、再编写一个新的Dockerfile文件,内容 以下dockerfile

#test
FROM imagea
MAINTAINER hello1

注意,该构建准备使用的基础镜像是上面构造出的镜像imagea
利用上面的dockerfile文件构建镜像: docker build -t imageb .
利用imagea镜像建立容器: docker run --name test2 -it imageb /bin/bash

咱们发现test2容器的根目录下有mydir目录,说明触发器执行了。 这个其实从构建imageb的输出日志就可看出。日志以下:

xxx@ubuntu:~/myimage$ docker build -t imageb .
Sending build context to Docker daemon 15.87 kB
Step 1 : FROM imagea
# Executing 1 build trigger...
Step 1 : RUN mkdir mydir
 ---> Running in e16c35c94b03
 ---> 4b393d1610a6
Removing intermediate container e16c35c94b03
Step 2 : MAINTAINER hello1
 ---> Running in c7b0312516ea
 ---> 0f63b8e04d82
Removing intermediate container c7b0312516ea
Successfully built 0f63b8e04d82

咱们能够看出,FROM指令执行以后,就当即执行的是触发器(ONBUILD指令指定的指令)

相关文章
相关标签/搜索