Dockerfile 最佳實踐

      網(wǎng)友投稿 894 2025-04-01

      dockerFile 最佳實踐


      一 減少構(gòu)建時間

      1.1 構(gòu)建順序影響緩存利用率

      把不需要經(jīng)常更改的行放到最前面,更改最頻繁的行放到最后面

      鏡像的構(gòu)建順序很重要,當你向 dockerFile 中添加文件,或者修改其中的某一行時,那一部分的緩存就會失效,該緩存的后續(xù)步驟都會中斷,需要重新構(gòu)建。

      1.2 只拷貝需要文件,防止緩存溢出

      當拷貝文件到鏡像中時,盡量只拷貝需要的文件,切忌使用 COPY . 指令拷貝整個目錄。如果被拷貝的文件內(nèi)容發(fā)生了更改,緩存就會被破壞。在上面的示例中,鏡像中只需要構(gòu)建好的 jar 包,因此只需要拷貝這個文件就行了,這樣即使其他不相關(guān)的文件發(fā)生了更改也不會影響緩存。

      1.3 最小化可緩存的執(zhí)行層

      每一個RUN指令都會被看作可緩存的執(zhí)行單元,太多的RUN指令會增加鏡像的層數(shù),增大鏡像的體積,而將所有的指令都放在一個RUN指令又會破壞緩存,從而延緩開放周期,一般都會先更新軟件索引信息,然后再安裝軟件。推薦將更新索引和安裝軟件放在同一個 RUN 指令中,這樣可以形成一個可緩存的執(zhí)行單元,否則你可能會安裝舊的軟件包。

      1.4 刪除比必要的依賴

      Dockerfile 最佳實踐

      刪除不必要的依賴,不要安裝調(diào)試工具。如果實在需要調(diào)試工具,可以在容器運行之后再安裝。某些包管理工具(如 apt)除了安裝用戶指定的包之外,還會安裝推薦的包,這會無緣無故增加鏡像的體積。apt 可以通過添加參數(shù) -–no-install-recommends 來確保不會安裝不需要的依賴項。如果確實需要某些依賴項,請在后面手動添加。

      1.5 刪除管理工具的緩存

      包管理工具會維護自己的緩存,這些緩存會保留在鏡像文件中,推薦的處理方法是在每一個 RUN 指令的末尾刪除緩存。如果你在下一條指令中刪除緩存,不會減小鏡像的體積。

      二 可維護性

      2.1 盡可能使用官方鏡像

      使用官方鏡像可以節(jié)省大量的維護時間,因為官方鏡像的所有安裝步驟都使用了最佳實踐。如果你有多個項目,可以共享這些鏡像層,因為他們都可以使用相同的基礎(chǔ)鏡像。

      2.2 使用更具體的標簽

      基礎(chǔ)鏡像盡量不要使用 latest 標簽。雖然這很方便,但隨著時間的推移,latest 鏡像可能會發(fā)生重大變化。因此在 Dockerfile 中最好指定基礎(chǔ)鏡像的具體標簽。我們使用 openjdk 作為示例,指定標簽為 8。其他更多標簽請查看官方倉庫。

      2.3 使用體積更小的基礎(chǔ)鏡像

      基礎(chǔ)鏡像的標簽風格不同,鏡像體積就會不同。slim 風格的鏡像是基于 Debian 發(fā)行版制作的,而 alpine 風格的鏡像是基于體積更小的 Alpine Linux 發(fā)行版制作的。其中一個明顯的區(qū)別是:Debian 使用的是 GNU 項目所實現(xiàn)的 C 語言標準庫,而 Alpine 使用的是 Musl C 標準庫,它被設計用來替代 GNU C 標準庫(glibc)的替代品,用于嵌入式操作系統(tǒng)和移動設備。因此使用 Alpine 在某些情況下會遇到兼容性問題。以 openjdk 為例,jre 風格的鏡像只包含 Java 運行時,不包含 SDK,這么做也可以大大減少鏡像體積。

      2.4 給鏡像設置合適的LABEL

      在 Dockerfile 中可以使用 Label 命令來為鏡像增加 Label,示例如下:

      我們可以查看到 Label 及使用 Label 進行篩選:

      三 重復利用

      3.1 在一致的環(huán)境中從源碼構(gòu)建

      首先應該確定構(gòu)建應用所需的所有依賴,本文的示例 Java 應用很簡單,只需要 Maven 和 JDK,所以基礎(chǔ)鏡像應該選擇官方的體積最小的 maven 鏡像,該鏡像也包含了 JDK。如果你需要安裝更多依賴,可以在 RUN 指令中添加。pom.xml 文件和 src 文件夾需要被復制到鏡像中,因為最后執(zhí)行 mvn package 命令(-e 參數(shù)用來顯示錯誤,-B 參數(shù)表示以非交互式的“批處理”模式運行)打包的時候會用到這些依賴文件。

      雖然現(xiàn)在我們解決了環(huán)境不一致的問題,但還有另外一個問題:每次代碼更改之后,都要重新獲取一遍 pom.xml 中描述的所有依賴項。下面我們來解決這個問題。

      3.2 在單獨的步驟中獲取依賴項目

      結(jié)合前面提到的緩存機制,我們可以讓獲取依賴項這一步變成可緩存單元,只要 pom.xml 文件的內(nèi)容沒有變化,無論代碼如何更改,都不會破壞這一層的緩存。上圖中兩個 COPY 指令中間的 RUN 指令用來告訴 Maven 只獲取依賴項。

      現(xiàn)在又遇到了一個新問題:跟之前直接拷貝 jar 包相比,鏡像體積變得更大了,因為它包含了很多運行應用時不需要的構(gòu)建依賴項。

      3.3 使用多階段構(gòu)建來刪除構(gòu)建時的依賴

      多階段構(gòu)建可以由多個 FROM 指令識別,每一個 FROM 語句表示一個新的構(gòu)建階段,階段名稱可以用 AS 參數(shù)指定。本例中指定第一階段的名稱為 builder,它可以被第二階段直接引用。兩個階段環(huán)境一致,并且第一階段包含所有構(gòu)建依賴項。

      第二階段是構(gòu)建最終鏡像的最后階段,它將包括應用運行時的所有必要條件,本例是基于 Alpine 的最小 JRE 鏡像。上一個構(gòu)建階段雖然會有大量的緩存,但不會出現(xiàn)在第二階段中。為了將構(gòu)建好的 jar 包添加到最終的鏡像中,可以使用 COPY --from=STAGE_NAME 指令,其中 STAGE_NAME 是上一構(gòu)建階段的名稱。

      四 構(gòu)建

      4.1 分階段構(gòu)建

      構(gòu)建鏡像最大的挑戰(zhàn)莫過于防止鏡像過大,造成實際運行時由于并發(fā)而導致拉取性能問題。為了應對這個挑戰(zhàn),很多轉(zhuǎn)型到容器的團隊采用兩個 Dockerfile,一個負責開發(fā)環(huán)境的鏡像構(gòu)建,一個負責生產(chǎn)環(huán)境的鏡像構(gòu)建。開發(fā)鏡像包含了代碼構(gòu)建所需要的環(huán)境,鏡像大小自然比較大,生產(chǎn)鏡像僅包含應用運行所需要的內(nèi)容,是很精簡的體積很小的鏡像。

      Docker 分階段構(gòu)建就可以很好地解決這個問題,使用如下的 Dockerfile 即可:

      整個 Dockerfile 流程很清晰,也不在需要額外的 shell 腳本來支持整個流程,并且我們可以指定執(zhí)行的 stage,具體命令如下:

      Docker

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Excel中Count函數(shù)統(tǒng)計考勤表的操作方法
      下一篇:EXCEL公式與函數(shù)入門之用來判斷是否滿足的邏輯函數(shù)之一的IF函數(shù)(函數(shù)是excel中已經(jīng)定義好的計算公式判斷題)
      相關(guān)文章
      亚洲精品无码高潮喷水A片软| 亚洲精品美女久久久久9999| 亚洲成人午夜电影| 91麻豆国产自产在线观看亚洲| 国产亚洲精品美女久久久久久下载| 亚洲精品无码mⅴ在线观看| 在线aⅴ亚洲中文字幕| 亚洲午夜一区二区三区| 2020国产精品亚洲综合网| 亚洲一区二区三区免费视频| 亚洲av无码国产综合专区| 亚洲国产精品成人精品小说| 亚洲成a人不卡在线观看| 91亚洲国产成人久久精品网址| 亚洲人成人77777在线播放| 国产亚洲sss在线播放| 亚洲日韩一区二区三区| 午夜亚洲国产理论片二级港台二级| 日韩亚洲变态另类中文| 亚洲区小说区图片区QVOD| 久久99国产亚洲高清观看首页| 亚洲AV无码成人精品区天堂| 久久久无码精品亚洲日韩蜜桃 | 久久久久久久亚洲Av无码| 亚洲精品午夜在线观看| 亚洲一级免费视频| 亚洲精品蜜夜内射| 亚洲精品tv久久久久久久久久| 红杏亚洲影院一区二区三区| 亚洲AV无码精品色午夜果冻不卡 | 亚洲网址在线观看| 亚洲一区二区久久| 亚洲sm另类一区二区三区| 亚洲国产精品丝袜在线观看| 亚洲一区AV无码少妇电影☆| 亚洲日韩涩涩成人午夜私人影院 | 亚洲砖码砖专无区2023| 亚洲av区一区二区三| 国产亚洲美女精品久久久久狼| 亚洲五月激情综合图片区| 亚洲色欲色欲www|