Dockerfile 第5關:ONBUILD和VOLUME指令
Dockerfile 第5關:ONBUILD和VOLUME指令
任務描述
本關的任務是學習ONBUILD和VOLUME兩個指令,要求學習者參照示例,熟悉ONBUILD和VOLUME兩個指令,本關將不做評測,無論輸入什麼都會評測通過。
本關將介紹ONBUILD、VOLUME指令。
●ONBUILD 新增一個將來執行的觸發器(trigger)
格式:ONBUILD <其它指令>
ONBUILD 是一個特殊的指令,它後面跟的是其它指令,比如RUN, COPY等,
而這些指令,在當前映象構建時並不會被執行。只有當以當前映象為基礎映象,去構建下一級映象的時候才會被執行。
(1) 在構建過程中,ONBUILD指令會新增到觸發器指令映象後設資料中,這些觸發器指令並不會在當前構建過程中執行。
(2) 在構建過程後,觸發器指令會被儲存在映象詳情中,其主鍵是OnBuild,可以使用docker inspect命令檢視。
(3) 在之後該映象可能作為其他Dockerfile中FROM指令的引數。在構建過程中,FROM指令會查詢ONBUILD觸發器指令,並且會以它們註冊的順序執行。若有觸發器指令執行失敗,則FROM指令被中止,並返回失敗;若所有觸發器指令執行成功,則FROM指令完成並繼續執行下面的指令。在映象構建完成後,觸發器指令會被清除,不會被子孫映象繼承。
1.首先編寫一個Dockerfile檔案,內容如下所示:
- FROM busybox
- 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,在裡面可以找到。
- "OnBuild":[
- "RUN touch 1.txt"
- ],
3.編寫一個新的Dockerfile檔案,內容如下所示:
- FROM image1
- 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,執行成功!!
- [root@localhost dir1]# docker build -t image2 .
- Sending build context to Docker daemon 2.048 kB
- Step 1/2 : FROM image1
- # Executing 1 build trigger...
- Step 1/1 : RUN touch 1.txt
- ---> Running in 5c9b99ef7801
- ---> 4c5b719176b8
- Removing intermediate container 5c9b99ef7801
- Step 2/2 : RUN echo 'hello'
- ---> Running in 8a2598e90e1f
- hello
- ---> f5642bb4a975
- Removing intermediate container 8a2598e90e1f
- Successfully built f5642bb4a975
- [root@localhost dir1]# docker run image2 cat 1.txt`
- [root@localhost dir1]#
●VOLUME 定義匿名卷
格式:VOLUME ["<路徑1>", "<路徑2>"...]或VOLUME <路徑>
之前我們說過,容器執行時應該儘量保持容器儲存層不發生寫操作,對於資料庫類需要儲存動態資料的應用,其資料庫檔案應該儲存於資料卷(volume)中,後面的章節我們會進一步介紹 Docker資料卷的概念。
參考文獻:《Docker容器與容器雲p179》
相關文章
- Dockerfile 第4關:ENV、EXPOSE、WORKDIR、ARG指令Docker
- docker筆記16-Dockerfile案例-ONBUILD命令案例Docker筆記UI
- DOCKERFILE的CMD指令和ENTRYPOINT指令Docker
- Dockerfile CMD和ENTRYPOINT指令Docker
- Dockerfile ADD和COPY指令Docker
- Dockerfile常用指令Docker
- Docker的Dockerfile指令Docker
- Dockerfile指令詳解Docker
- 『現學現忘』Docker基礎 — 37、ONBUILD指令介紹DockerUI
- Dockerfile中指令詳解Docker
- docker之Dockerfile指令介紹Docker
- Dockerfile---指令碼自動化Docker指令碼
- PHP 5 Dockerfile 改造過程PHPDocker
- 5.call和ret指令
- 解讀三組容易混淆的Dockerfile指令Docker
- Docker - 02 建立映象 Dockerfile 指令速查表Docker
- 白話理解和使用DOCKER VOLUMEDocker
- Dockerfile和DockerCompose的使用Docker
- Dockerfile裡的VOLUMES關鍵字Docker
- 解剖Nginx·自動指令碼篇(5)編譯器相關主指令碼Nginx指令碼編譯
- Dockerfile小記之ARG和ENVDocker
- Docker VolumeDocker
- 精讀Nginx·自動指令碼篇(5)編譯器相關主指令碼Nginx指令碼編譯
- DockerfileDocker
- Docker 入門系列四:Dockerfile-關鍵字Docker
- sqli-labs 第25關(過濾or和AND )SQL
- docker建立volume 指定volume 匯出image 匯入imageDocker
- MySQL 多例項啟動和關閉指令碼MySql指令碼
- oracle啟動和關閉指令碼for LinuxOracle指令碼Linux
- 第2關
- Docker, Dockerfile, 和Docker Compose區別 | BaeldungDocker
- dockerfile相關(4):docker常用基礎映象——java映象DockerJava
- 安裝sun cluster3.0和volume manger3.5
- Dockerfile指令與Docker-compose容器編排-搭建docker私有倉庫Docker
- Dockerfile技巧Docker
- Docker DockerfileDocker
- Docker Volume介紹Docker
- Oracle ASM Volume DirectoryOracleASM