iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

自我學習Docker的30天奇幻旅程系列 第 13

Day13 Dockerfile指令大集(二)

  • 分享至 

  • xImage
  •  

今天頭很痛可能會寫得有點亂,不過還是讓我們繼續Dockerfile的指令學習吧。

指令介紹

EXPOSE

expose有公開的意思,因此其功能類似於使用run指令時下的-p flag,可以指定的網絡端口(端口有TCP以及UDP),不過寫在expose的port不會真的被公開,只是當作一個紀錄而已。

EXPOSE 80/tcp
EXPOSE 80/udp
# 也可以同時設定兩個,那就會對TCP以及UDP各別公開

ADD / COPY

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

VOLUME就是之前提到用來儲存資料的東西,而這邊的指令則是在指定container要使用的VOLUME
格式:

VOLUME ["/data"]

也可以帶入多個參數

VOLUME ["/var/log/"]
# 如上則會對應VOLUME /var/log 或是 VOLUME /var/log /var/db

WORKDIR

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

ONBUILD是一個強大的功能,類似於繼承的概念,當有新的image需要以此建置當基礎時就可以使用到ONBUILD。當建立的時候會將ONBUILD的命令儲存起來,因此當前指令不會生效。之後當我們使用FROM將此image作為基礎來建立新的image時,builder就會尋找ONBUILD並執行,當ONBUILD執行失敗那建置也會中止。
格式:

ONBUILD <INSTRUCTION>

示例

ONBUILD COPY . /src
ONBUILD RUN APP --dir /src
# 繼承的image就會先將上層的image依照此指令執行。

HEALTHCHECK

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

可以改變Shell,以window來說可以更換powershell、cmd以及sh,更換後的指令就會變為運行在對應的shell

總結:

寫著寫著頭就不痛了,難道這就是知識的力量嗎。/images/emoticon/emoticon12.gif
既然已經學完了所有Dockerfile指令,接下來就要來練習寫Dockerfile了

參考文獻:
docker官方文件


上一篇
Day12 Dockerfile指令大集(一)
下一篇
Day14 Docker Compose file指令大集(一)
系列文
自我學習Docker的30天奇幻旅程24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言