Dockerfile 第5關:ONBUILD和VOLUME指令

花米徐發表於2017-11-24

Dockerfile    第5關:ONBUILD和VOLUME指令

任務描述

本關的任務是學習ONBUILD和VOLUME兩個指令,要求學習者參照示例,熟悉ONBUILD和VOLUME兩個指令,本關將不做評測,無論輸入什麼都會評測通過。

相關知識

本關將介紹ONBUILDVOLUME指令。

ONBUILD指令

●ONBUILD 新增一個將來執行的觸發器(trigger)
格式:
ONBUILD <其它指令>

ONBUILD 是一個特殊的指令,它後面跟的是其它指令,比如RUNCOPY等,
而這些指令,在當前映象構建時並不會被執行。只有當以當前映象為基礎映象,去構建下一級映象的時候才會被執行。

ONBUILD指令的具體執行步驟

(1) 在構建過程中,ONBUILD指令會新增到觸發器指令映象後設資料中,這些觸發器指令並不會在當前構建過程中執行。
(2) 在構建過程後,觸發器指令會被儲存在映象詳情中,其主鍵是
OnBuild,可以使用docker inspect命令檢視。
(3) 在之後該映象可能作為其他Dockerfile中FROM指令的引數。在構建過程中,
FROM指令會查詢ONBUILD觸發器指令,並且會以它們註冊的順序執行。若有觸發器指令執行失敗,則FROM指令被中止,並返回失敗;若所有觸發器指令執行成功,則FROM指令完成並繼續執行下面的指令。在映象構建完成後,觸發器指令會被清除,不會被子孫映象繼承。

ONBUILD指令的例項

1.首先編寫一個Dockerfile檔案,內容如下所示:

  1. FROM busybox
  2. ONBUILD RUN touch 1.txt

2.利用上面的Dockerfile檔案構建一個新映象:docker build -t image1 .。執行docker run image1 cat 1.txt,提示:cat: can't open '1.txt': No such file or directory。可以知道基於image1映象構建的容器中不存在1.txt檔案。我們通過inspect image1,在裡面可以找到。

  1. "OnBuild":[
  2. "RUN touch 1.txt"
  3. ],

3.編寫一個新的Dockerfile檔案,內容如下所示:

  1. FROM image1
  2. RUN echo 'hello'

4.利用第三步建立的的Dockerfile檔案構建一個新映象:docker build -t image2 .。如下所示:在執行完FROM指令後,首先執行的是觸發器,也就是# Executing 1 build trigger...,該指令建立了一個1.txt檔案。然後才執行RUN echo 'hello'。執行docker run image2 cat 1.txt,執行成功!!

  1. [root@localhost dir1]# docker build -t image2 .
  2. Sending build context to Docker daemon 2.048 kB
  3. Step 1/2 : FROM image1
  4. # Executing 1 build trigger...
  5. Step 1/1 : RUN touch 1.txt
  6. ---> Running in 5c9b99ef7801
  7. ---> 4c5b719176b8
  8. Removing intermediate container 5c9b99ef7801
  9. Step 2/2 : RUN echo 'hello'
  10. ---> Running in 8a2598e90e1f
  11. hello
  12. ---> f5642bb4a975
  13. Removing intermediate container 8a2598e90e1f
  14. Successfully built f5642bb4a975
  15.  
  16. [root@localhost dir1]# docker run image2 cat 1.txt`
  17. [root@localhost dir1]#

VOLUME指令

●VOLUME 定義匿名卷
格式:
VOLUME ["<路徑1>", "<路徑2>"...]VOLUME <路徑>

之前我們說過,容器執行時應該儘量保持容器儲存層不發生寫操作,對於資料庫類需要儲存動態資料的應用,其資料庫檔案應該儲存於資料卷(volume)中,後面的章節我們會進一步介紹 Docker資料卷的概念。

參考文獻:《Docker容器與容器雲p179》

相關文章