優化 Docker 鏡像 技巧

優化 Docker 鏡像可以提高構建速度、減少鏡像大小、提高安全性和效率。以下是一些優化 Docker 鏡像的方法:

使用適當的基礎鏡像

選擇合適的基礎鏡像可以減小鏡像大小,并確保基礎鏡像的安全性和更新性。Alpine、Ubuntu Minimal 等輕量級基礎鏡像是常用選擇。

使用多階段構建

多階段構建是一種有效的優化技術,可以在一個Dockerfile中使用多個FROM指令,每個FROM指令都代表一個構建階段。每個構建階段都可以從之前的階段復制所需的文件,并執行特定的構建操作。

使用多階段構建可以使得最終生成的鏡像只包含運行應用程序所必需的文件和依賴,而不包含構建過程中產生的不必要文件和依賴。以下是一個多階段構建的示例:

?#?構建階段1
FROM?golang:1.17?AS?builderWORKDIR?/ap
COPY?.?.#?編譯應用程序
RUN?go?build?-o?myapp#?構建階段2
FROM?alpine:latest#?復制編譯后的應用程序
COPY?--from=builder?/app/myapp?/usr/local/bin/#?設置工作目錄
WORKDIR?/usr/local/bin#?容器啟動時運行的命令
CMD?["myapp"]

在上面的例子中,我們使用兩個構建階段。第一個構建階段使用Golang基礎鏡像來編譯應用程序,第二個構建階段使用Alpine Linux基礎鏡像,僅復制編譯后的應用程序,并設置容器啟動時的命令。

有效使用緩存

當構建 Docker 鏡像時,Docker 使用緩存來優化構建過程,避免重復構建不變的層。下面是一個使用緩存機制的例子:假設有一個簡單的 Node.js 項目,其中有一個 package.json 文件和應用代碼文件,例如 app.js。為了構建這個項目的 Docker 鏡像,可以編寫一個 Dockerfile 如下:

#?設置基礎鏡像
FROM?node:14#?設置工作目錄
WORKDIR?/app#?將?package.json?復制到工作目錄
COPY?package*.json?./#?運行?npm?install?安裝依賴
RUN?npm?install#?將應用代碼復制到工作目錄
COPY?.?.#?指定容器啟動命令
CMD?["node",?"app.js"]

在這個 Dockerfile 中,我們將 package.json 文件復制到容器中,并運行 npm install 命令來安裝依賴。接著,復制應用代碼到容器,并設置容器的啟動命令。

當我們構建這個鏡像時,Docker 使用緩存機制來盡可能地重用之前構建過的層。如果 package.json 文件沒有改變,Docker 將會重復使用之前的緩存層,只有當 package.json 文件發生變化時才會重新運行 npm install 這個命令。

例如,首次構建鏡像時,Docker 會運行 npm install 安裝依賴,并創建一個緩存層。

在后續構建過程中,如果只有 app.js 文件發生了改變,而 package.json 文件沒有變化,Docker 將會重用之前的緩存層,直接復制 app.js 到鏡像中,而無需重新安裝依賴,從而加快構建速度。

這種緩存機制可以大幅提升構建速度,特別是在開發過程中,當只有部分文件發生變化時,Docker 可以重復使用之前的層而不必重新構建整個鏡像。

多層鏡像構建優化

多層鏡像構建是指在一個Dockerfile中使用多個RUN指令來構建鏡像。每個RUN指令會產生一個新的鏡像層,而每個鏡像層都會占用額外的存儲空間。

為了優化多層鏡像構建,可以使用&&操作符將多個命令合并成一個RUN指令,避免產生額外的鏡像層。同時,在一個RUN指令中執行多個命令可以減少Docker鏡像的大小。

例如,將多個apt-get安裝命令合并成一個RUN指令:

RUN?apt-get?update?&&?apt-get?install?-y?\package1?\package2?\package3

這樣可以將多個安裝命令合并為一個鏡像層,減少鏡像大小。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74452.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74452.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74452.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2021年藍橋杯第十二屆CC++大學B組真題及代碼

目錄 1A:空間(填空5分_單位轉換) 2B:卡片(填空5分_模擬) 3C:直線(填空10分_數學排序) 4D:貨物擺放(填空10分_質因數) 5E&#xf…

Python入門基礎

python基礎類型轉換 str()與int()類型轉換 name 張三 age 20 print(type(name),type(age))print(我叫name 今年, str(age)歲 )a10 b198.8 cFalse print(type(a),type(b),type(c)) print(str(a),str(b),str(c))s1 128 f198.7 s276.77 ffTrue s3hello print(type(s…

HTTP/HTTPS 中 GET 請求和 POST 請求的區別與聯系

一、基礎概念 HTTP (HyperText Transfer Protocol, 超文本傳輸協議) 是一種用于瀏覽器與服務器之間進行數據交互的協議。HTTPS (加密的 HTTP) 則通過 SSL/TLS 協議實現通信加密與數據安全性。 二、GET 和 POST 概述 GET 請求: 用于從服務器獲取資源。 POST 請求: 用于將數據…

OPENCV數字識別(非手寫數字/采用模板匹配)

這篇文章的重點在于 模板匹配 的使用。模板匹配是計算機視覺中的一項基本技術,它通過比對輸入圖像與模板圖像的相似度,來進行目標識別。對于數字識別,特別是標準數字的識別,模板匹配非常有效。 請看效果: 文章結構 …

在 Kubernetes 中部署 Trivy 漏洞掃描服務

創建專用 Namespace # trivy-ns.yaml apiVersion: v1 kind: Namespace metadata: name: trivy-system配置持久化存儲(緩存數據庫) apiVersion: v1 kind: PersistentVolumeClaim metadata: name: trivy-db-cache namespace: trivy-system spec: acc…

Cursor安裝注冊+基礎配置+入門實操

一、安裝注冊 官網地址:https://www.cursor.com/ 下載按鈕會根據電腦系統來匹配,點擊對應「Download」按鈕進行下載。完成后,按步驟安裝即可。 安裝完成后,即可點擊圖標打開軟件。 基礎設置完成后,就需要選擇注冊賬號…

秒殺業務優化之從分布式鎖到基于消息隊列的異步秒殺

一、業務場景介紹 優惠券、門票等限時搶購常常出現在各類應用中,這樣的業務一般為了引流宣傳而降低利潤,所以一旦出現問題將造成較大損失,那么在業務中就要求我們對這類型商品嚴格限時、限量、每位用戶限一次、準確無誤的創建訂單&#xff0c…

MiniMax GenAI 可觀測性分析:基于阿里云 SelectDB 構建 PB 級別日志系統

“阿里云SelectDB作為MiniMax日志存儲服務的核心支撐,為在線和離線業務提供了高效、穩定的查詢與聚合分析能力。其支持實時物化視圖、租戶資源隔離、冷熱分離等企業級特性,不僅有效解決了日志場景下PB級別數據查詢的性能瓶頸,還通過智能化的資…

【YOLO V3】目標檢測 Darknet 訓練自定義模型

【YOLO V3】目標檢測 Darknet 訓練自定義模型 前言整體思路環境檢查與依賴配置克隆 YOLOv3 Darknet 并編譯Clone Darknet 項目文件修改 Makefile 文件修改模型保存頻率項目編譯 準備數據集配置訓練文件數據集:datasets (自制)權重文件 yolov3…

Kafka分區分配策略詳解

Kafka分區分配策略詳解 Kafka作為當前最流行的分布式消息隊列系統,其分區分配策略直接影響著系統的性能、可靠性和可擴展性。合理的分區分配不僅能夠提高數據處理的效率,還能確保系統負載的均衡。 Kafka提供了多種內置的分區分配策略,包括R…

C#中 String類API(函數)

字符串屬性 string str "打工人";Console.WriteLine(str);char s str[0];Console.WriteLine(s); 字符串內置API(函數) 1. Concat 拼接字符串 string s1 "打";string s2 "工";string s3 "人";string sthstring.Concat(s1, s2, s…

JavaScript性能優化實戰手冊:從V8引擎到React的毫秒級性能革命

目錄 一、性能優化的本質挑戰1.1 瀏覽器渲染管線的性能瓶頸2.1 內存管理優化2.2 執行效率優化2.3 網絡傳輸優化 三、React框架深度調優3.1 渲染性能優化3.2 性能監控體系 四、企業級優化案例4.1 電商平臺首頁優化4.2 數據可視化大屏優化 五、新一代性能優化技術5.1 WASM性能突破…

【PostgreSQL】pg各版本選用取舍邏輯與docker安裝postgres:15

企業常用 PostgreSQL 版本推薦 1. PostgreSQL 14(最常見,穩定) 目前許多企業仍在使用 PostgreSQL 14,因為它在性能、并發處理、JSON 支持等方面做了較多優化,同時又非常穩定。官方支持時間:2026 年 11 月…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加導出數據功能

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏+關注哦 ?? 目錄 DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加導出數據功能??頁面效果??指令輸入?…

《Python實戰進階》第31集:特征工程:特征選擇與降維技術

第31集:特征工程:特征選擇與降維技術 摘要 特征工程是機器學習和數據科學中不可或缺的一環,其核心目標是通過選擇重要特征和降低維度來提升模型性能并減少計算復雜度。本集聚焦于特征選擇與降維技術,涵蓋過濾法、包裹法、嵌入法等…

避雷 :C語言中 scanf() 函數的錯誤?使用!!!

1. 返回值說明 scanf函數會返回成功匹配并賦值的輸入項個數&#xff0c;而不是返回輸入的數據。 可以通過檢查返回值數量來確認輸入是否成功。若返回值與預期不符&#xff0c;就表明輸入存在問題。 #include <stdio.h>int main() {int num;if (scanf("%d", …

Excel第41套全國人口普查

2. 導入網頁中的表格&#xff1a;數據-現有鏈接-考生文件夾&#xff1a;網頁-找到表格-點擊→變為√-導入刪除外部鏈接關系&#xff1a;數據-點擊鏈接-選中連接-刪除-確定&#xff08;套用表格格式-也會是刪除外部鏈接&#xff09;數值縮小10000倍&#xff08;除以10000即可&am…

WPS宏開發手冊——使用、工程、模塊介紹

目錄 系列文章前言1、開始1.1、宏編輯器使用步驟1.2、工程1.3、工程 系列文章 使用、工程、模塊介紹 JSA語法 第三篇練習練習題&#xff0c;持續更新中… 前言 如果你是開發人員&#xff0c;那么wps宏開發對你來說手拿把切。反之還挺吃力&#xff0c;需要嘻嘻&#xf…

EtherCAT轉CANopen配置CANopen側的PDO映射

EtherCAT轉CANopen配置CANopen側的PDO映射 在工業自動化領域&#xff0c;EtherCAT和CANopen是兩種廣泛應用的通信協議。它們各自具有獨特的優勢&#xff0c;但在某些應用場景下&#xff0c;需要將這兩種協議進行轉換以實現設備間的高效數據交換。本文將詳細介紹如何在使用Ethe…

【QT】Qt creator快捷鍵

Qt creator可以通過以下步驟快捷鍵査看調用關系&#xff1a; 1.打開代碼文件。 2.將光標放在你想要查看調用關系的函數名上。 3.按下鍵盤快捷鍵 CtrlshiftU。 4.彈出菜單中選擇“調用路徑”或“被調用路徑” 5.在彈出的窗口中可以查看函數的調用關系 折疊或展開代碼快捷鍵&…