今天頭很痛可能會寫得有點亂,不過還是讓我們繼續Dockerfile的指令學習吧。
expose有公開的意思,因此其功能類似於使用run指令時下的-p
flag,可以指定的網絡端口(端口有TCP以及UDP),不過寫在expose的port不會真的被公開,只是當作一個紀錄而已。
EXPOSE 80/tcp
EXPOSE 80/udp
# 也可以同時設定兩個,那就會對TCP以及UDP各別公開
ADD跟COPY就一起介紹吧,因為這兩個功能大同小異,都是能夠將檔案或是路徑從指定路徑<src>
添加至指定的Docker的系統文件中<dest>
,格式如下
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
# 要使用ADD就將COPY改成ADD就好
剛剛提到ADD跟COPY之間的小異就是指,ADD能夠接收的格式有多兩種使用remote URL以及tar提取,而一般本地端檔案的複製使用還是以COPY為主,而remote URL其實可以使用RUN命令在搭配curl來替代效率會更好,因此ADD最好的用法就是將本地的tar檔案提取到container
VOLUME就是之前提到用來儲存資料的東西,而這邊的指令則是在指定container要使用的VOLUME
格式:
VOLUME ["/data"]
也可以帶入多個參數
VOLUME ["/var/log/"]
# 如上則會對應VOLUME /var/log 或是 VOLUME /var/log /var/db
workdir作為工作目錄,提供給RUN
, CMD
, ENTRYPOINT
, COPY
and ADD
指令來使用,沒有建立的話Docker會自動建立。
workdir可以多行使用,當前的workdir會相對於前面的workdir,如例:
WORKDIR /first
WORKDIR second
WORKDIR third
RUN path
# path 執行的workdir則是 /first/second/third
ONBUILD是一個強大的功能,類似於繼承的概念,當有新的image需要以此建置當基礎時就可以使用到ONBUILD。當建立的時候會將ONBUILD的命令儲存起來,因此當前指令不會生效。之後當我們使用FROM將此image作為基礎來建立新的image時,builder就會尋找ONBUILD並執行,當ONBUILD執行失敗那建置也會中止。
格式:
ONBUILD <INSTRUCTION>
示例
ONBUILD COPY . /src
ONBUILD RUN APP --dir /src
# 繼承的image就會先將上層的image依照此指令執行。
HEALTHCHECK指令用來讓Docker了解如何檢查image是否健康,透過HEALTHCHECK在啟動的時候狀態就會顯示health如果一定次數的啟動失敗就會變得unhealthy
HEALTHCHECK可以配置四種設定
--interval=DURATION
(default: 30s) 檢查的間隔--timeout=DURATION
(default: 30s) 檢查運行的最大時間上限--start-period=DURATION
(default: 0s) 開始時間 提供給需要時間進行引導的容器--retries=N
(default: 3) 重試次數可以改變Shell,以window來說可以更換powershell、cmd以及sh,更換後的指令就會變為運行在對應的shell
寫著寫著頭就不痛了,難道這就是知識的力量嗎。
既然已經學完了所有Dockerfile指令,接下來就要來練習寫Dockerfile了
參考文獻:
docker官方文件