2023 iT邦鐵人賽 Day 17 - 這樣看映像層
前言
昨天跟大家介紹了什麼是映像檔,原來映像檔就是由一層一層的映像層 (layer) 所堆疊而成。有人說他是千層蛋糕,有人說是堆積木,也有人說是漢堡,基本上都是在形容映像層的層層堆疊。
我們今天就來看看每個映像檔中的映像層,讓大家更能明白映像層的堆疊。
映像檔的黑歷史
標題聳動了點,也不是什麼不堪入目的東西,這裡我們會透過 history
指令,查看特定映像檔,每層映像層的資訊。
image history
1 | > docker image history ruby:latest |
這是查看 ruby:latest
這個映像檔的資訊,上面寫著這個映像檔是由哪些映像層 ( IMAGE ) 由下往上堆疊而成,簡單說明:
- IMAGE 是映像層 ID
- CREATED_BY 是製造這一層映像層的指令 (之後會在 Dockerfile 中解釋)
是因為,並非所有的層都是在同一個 Repository,所以當我們從 Docker hub 把映像檔 pull 下來時,這些不在 Docker hub 的 Repository 的映像層就會顯示為 - 為什麼有些容量是 0,有些不是?因為 0B 的映像層只是在執行某些指令,並無產生東西,有容量的層就代表該層有在產生檔案。
要怎麼看到被截斷的完整訊息?
在 CREATED_BY 欄位的資料,都因為資訊過多過長,導致被截斷了。如果想要看完整的內容,可以使用 --no-trunc
讓所有欄位的資訊都顯示完整資訊:
1 | > docker image history ruby:latest --no-trunc |
這時你會發現,因為所有訊息都顯示出來,導致版面很歪…
別擔心,我們可以用 --format
只顯示我們想要的特定欄位:
1 | > docker image history ruby:latest --format "{{.CreatedBy}}" --no-trunc |
在 --format
後面接的參數是 Go Template 的格式,再多示範一個:
1 | > docker image history ruby --format "{{.ID}} => {{.Size}}" --no-trunc |
總結
經過 image history
的展示,我想大家應該都對映像檔跟映像層之間的關係,更加緊密,更加熟悉了吧~
突然想到一個比喻,希望大家都有玩過 LF2。每個角色的技能都是一個映像檔,可以一直尻一直尻,就像容器一直建立一直建立。那技能 ( 映像檔 ) 通常都是透過多個按鍵 ( 映像層 ) 組合 ( 堆疊 )而成,像是冰人的抽冰劍,D 下 J,這個抽冰劍映像檔是由 D 下 J 三個層建立的。
好了,快離題了,明天我們會透過映像層慢慢把視野拉開到映像檔到容器,希望能讓大家更明白映像層、映像檔、容器,之間的構成關係。