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指令指定的指令)

相關文章
相關標籤/搜索