Docker從入門到放棄

Docker 構(gòu)建鏡像:

如:
錯誤書寫方式

之前說過,Dockerfile 中每一個指令都會建立一層, RUN 也不例外。每一個 RUN 的行為, 就和剛才我們手工建立鏡像的過程一樣:新建立一層,在其上執(zhí)行這些命令,執(zhí)行結(jié)束 后, commit 這一層的修改,構(gòu)成新的鏡像。

而上面的這種寫法,創(chuàng)建了 7 層鏡像。這是完全沒有意義的,而且很多運行時不需要的東 西,都被裝進了鏡像里,比如編譯環(huán)境、更新的軟件包等等。結(jié)果就是產(chǎn)生非常臃腫、非常 多層的鏡像,不僅僅增加了構(gòu)建部署的時間,也很容易出錯。 這是很多初學(xué) Docker 的人常 犯的一個錯誤。
Union FS 是有最大層數(shù)限制的,比如 AUFS,曾經(jīng)是最大不得超過 42 層,現(xiàn)在是不得超過 127 層。
上面的 Dockerfile 正確的寫法應(yīng)該是這樣:


正確書寫方式

首先,之前所有的命令只有一個目的,就是編譯、安裝 redis 可執(zhí)行文件。因此沒有必要建立 很多層,這只是一層的事情。因此,這里沒有使用很多個 RUN 對一一對應(yīng)不同的命令,而是 僅僅使用一個 RUN 指令,并使用 && 將各個所需命令串聯(lián)起來。將之前的 7 層,簡化為了 1 層。在撰寫 Dockerfile 的時候,要經(jīng)常提醒自己,這并不是在寫 Shell 腳本,而是在定義每 一層該如何構(gòu)建。
并且,這里為了格式化還進行了換行。Dockerfile 支持 Shell 類的行尾添加 \ 的命令換行方 式,以及行首 # 進行注釋的格式。良好的格式,比如換行、縮進、注釋等,會讓維護、排障 更為容易,這是一個比較好的習(xí)慣。
此外,還可以看到這一組命令的最后添加了清理工作的命令,刪除了為了編譯構(gòu)建所需要的 軟件,清理了所有下載、展開的文件,并且還清理了 apt 緩存文件。這是很重要的一步,我 們之前說過,鏡像是多層存儲,每一層的東西并不會在下一層被刪除,會一直跟隨著鏡像。 因此鏡像構(gòu)建時,一定要確保每一層只添加真正需要添加的東西,任何無關(guān)的東西都應(yīng)該清 理掉。
很多人初學(xué) Docker 制作出了很臃腫的鏡像的原因之一,就是忘記了每一層構(gòu)建的最后一定要 清理掉無關(guān)文件。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《Docker從入門到實踐》閱讀筆記 原書地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo閱讀 11,642評論 1 39
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 9,005評論 1 21
  • 我不會再愛你,也不會恨你。我感謝你,讓我喜歡過你。謝謝你讓我成長,讓我懂得為愛的人付出,讓我知道喜歡的東西要自己努...
    沫小美閱讀 342評論 0 1
  • 跟過去比,只要有進步就是好的。 做一個決定難,實踐一個決定更難。 良師益友
    ViminX閱讀 163評論 0 0
  • 九月是開學(xué)的季節(jié),也是故事發(fā)生的季節(jié)。九月里的遇見注定是不平凡的,九月里的故事注定是你一生的羈絆。 01 今年入秋...
    風(fēng)妍淺淺閱讀 623評論 0 3

友情鏈接更多精彩內(nèi)容