Docker 分階段構建

Docker 分階段構建

Docker 分階段構建(Multi-stage Build)是一種高效的鏡像構建技術,允許在一個 Dockerfile 中使用多個構建階段,每個階段可以使用不同的基礎鏡像,最終只保留需要的文件,從而顯著減小鏡像體積。以下是分階段構建的核心概念和示例:

為什么使用分階段構建?

  1. 減小鏡像體積:最終鏡像只包含運行時所需的文件,不包含構建工具和臨時文件。
  2. 簡化 Dockerfile:無需手動清理中間文件,每個階段專注于特定任務。
  3. 提高安全性:生產環境鏡像不包含不必要的構建依賴,降低安全風險。

基本語法

使用?FROM <image> AS <stage-name>?定義多個構建階段:

# 第一階段:構建應用(使用較大的基礎鏡像)
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build# 第二階段:運行應用(使用輕量級基礎鏡像)
FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/dist ./dist  # 只復制構建結果
RUN npm install --production  # 只安裝生產依賴
CMD ["node", "dist/main.js"]

關鍵點說明

  1. 階段命名:使用?AS <stage-name>?為每個階段命名,便于后續引用。
  2. 文件復制:使用?COPY --from=<stage-name>?從之前的階段復制文件。
  3. 基礎鏡像選擇:構建階段可使用完整的 SDK 鏡像,運行階段使用輕量級的運行時鏡像(如?alpine?或?slim)。

常見場景示例

1. Go 應用分階段構建
# 構建階段
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp# 運行階段
FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
2. Java Spring Boot 應用分階段構建
# 構建階段
FROM maven:3.8.6-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests# 運行階段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/myapp.jar .
CMD ["java", "-jar", "myapp.jar"]

高級技巧

  1. 多階段復用:一個階段可以從多個之前的階段復制文件。
  2. 條件構建:使用?--target?參數指定構建到特定階段(用于調試):
    docker build --target builder -t myapp:builder .
    
  3. 緩存優化:合理安排?COPY?指令順序,利用 Docker 構建緩存。

注意事項

  • 每個?FROM?語句都會創建一個新階段,之前階段的環境不會延續。
  • 最終鏡像體積只包含最后一個階段的內容。
  • 分階段構建不會影響構建速度,但能大幅減小鏡像體積。

通過分階段構建,你可以創建更高效、更安全的 Docker 鏡像,同時保持開發流程的簡潔性。

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

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

相關文章

人工智能學習23-BP-圖像編碼

人工智能學習概述—快手視頻 人工智能學習23-BP-圖像編碼—快手視頻

k8s的開篇學習和安裝

k8s的開篇學習 學習網站 參考資料 1。 K8S能干什么 [概述 | Kubernetes](https://kubernetes.io/zh-cn/docs/concepts/overview/#why-you-need-kubernetes-and-what-can-it-do)需要開代理 2。docker資料 https://docs.docker.com/get-started/3.prometheus資料 https://promet…

CS144 lab0: warmup

Lab 0: networking warmup 1. 環境 依賴配置 sudo apt update && sudo apt install git cmake gdb build-essential clang \clang-tidy clang-format gcc-doc pkg-config glibc-doc tcpdump tsharkg13配置 ppa中科大源 # deb https://ppa.launchpadcontent.net/ubu…

StarRocks

StarRocks 是一個高性能的 分布式 MPP(Massively Parallel Processing)數據庫,主要用于 實時數據分析(Real-Time Analytics),是新一代的 OLAP 數據庫,對標 ClickHouse、Apache Doris 等。 ?? 一、StarRocks 是什么? StarRocks 是一個面向實時分析場景、支持高并發、高…

8088單板機8259中斷的軟件觸發測試

1.工作原理 8086和8088的中斷設計的是很巧妙的&#xff0c;比如給8259的IR1配置了一個中斷&#xff0c;中斷號為21H&#xff0c;那么當真個引腳出現高電平的時候&#xff0c;就會觸發相應上的中斷響應。但&#xff0c;這不是唯一能夠觸發21H中斷的方法&#xff0c;還可以通過軟…

TC3xx中PFLASH緩存對XCP標定常量的影響

1、TC3xx中PFLASH緩存&#xff08;Cache&#xff09;對XCP標定的影響 XCP的映射用到TC3XX的Overlay功能需要使用一段Pflash內存。 Pflash數據有兩個段區。分別為0x80000000和0xA0000000為起始地址的PFLASH段。 如上&#xff0c;兩段數據的區別是一個段8有CACHE緩存&#xff0c;…

代碼審計服務:如何解決誤報與漏報難題,保障軟件安全?

代碼審計服務在保障軟件質量、安全合規等方面扮演著關鍵角色&#xff0c;特別是在數字化浪潮席卷而來的今天&#xff0c;其重要性日益顯著。它能揭露代碼中的不足&#xff0c;進而為軟件開發提供有力的效率和安全性保障。 誤報與漏報難題 常規的代碼審查工具&#xff0c;其錯…

web方向第一次考核內容

一.考核內容 Web組大一下考核之HTML、CSS 1.為什么要清除浮動&#xff08;4)&#xff0c;清除浮動的方法有哪些&#xff1f;(6)&#xff08;至少兩種&#xff09; 2.怎么實現左邊左邊寬度固定右邊寬度自適應的布局&#xff1f;(10) 3.講講flex:1;(10) 4.怎么實現移動端適配不同…

HarmonyOS 5 Cordova有哪些熱門插件?

以下是 HarmonyOS 5 環境下 Cordova 的熱門插件及核心代碼實現&#xff08;綜合實際開發場景高頻使用&#xff09;&#xff1a; 一、核心工具類插件 1. ?高性能圖片壓縮插件? ?功能?&#xff1a;直接調用鴻蒙 ImageSource API 實現硬件級加速壓縮 ?代碼實現?&#xff…

Cesium圓錐漸變色實現:融合頂點著色器、Canvas動態貼圖與靜態紋理的多方案整合

在Cesium中渲染圓錐體時&#xff0c;無論采用頂點著色器、Canvas動態貼圖還是靜態圖片貼圖&#xff0c;其漸變色均需滿足以下條件&#xff1a; 圓形結構&#xff1a;漸變范圍限定在圓錐底面的圓形區域內。徑向擴散&#xff1a;顏色從圓心向外逐步變化&#xff08;如紅→黃→藍…

周末復習1

質量管理包括質量規劃&#xff0c;質量保證&#xff0c;質量控制。質量管理體系要定期執行內部審核和管理評審。二者都屬于質量保證過程。 實施質量保證的方法很多&#xff0c;過程分析屬于實施質量保證的常用方法。 采購管理過程包括編制采購計劃,實施采購,控制采購和結束采購…

英飛凌亮相SEMICON China 2025:以SiC、GaN技術引領低碳化與數字化未來

在剛剛落幕的SEMICON China 2025上&#xff0c;全球半導體行業再度匯聚上海&#xff0c;共同探討產業未來。本屆展會以“跨界全球?心芯相聯”為主題&#xff0c;覆蓋芯片設計、制造、封測、設備及材料等全產業鏈&#xff0c;充分展現了半導體技術的最新突破與創新趨勢。 作為…

工業路由器賦能倉庫消防預警,智慧消防物聯網解決方案

在現代物流與倉儲行業蓬勃發展的當下&#xff0c;倉庫的規模與存儲密度不斷攀升&#xff0c;消防預警的重要性愈發凸顯。傳統消防系統在應對復雜倉庫環境時&#xff0c;預警滯后、設備聯動不暢、數據管理困難等弊端逐漸暴露。為了有效解決這些問題&#xff0c;工業路由器作為物…

【開發常用命令】:服務器與本地之間的數據傳輸

服務器與本地之間的數據傳輸 本地給服務器上傳數據 scp /path/to/local_file usernameremotehost:/path/to/remote_directory例如 scp test.txt root192.168.1.xxx:/test # test.txt 需要上傳到服務器的文件&#xff0c;如果非當前路徑&#xff0c;使用文件的相對路徑或絕對…

springboot + nacos + k8s 優雅停機

1 概念 優雅停機是什么&#xff1f;網上說的優雅下線、無損下線&#xff0c;都是一個意思。 優雅停機&#xff0c;通常是指在設備、系統或應用程序中止運作前&#xff0c;先執行一定的流程或動作&#xff0c;以確保數據的安全、預防錯誤并保證系統的整體穩定。 一般來說&…

Python 標準庫之 math 模塊

1. 前言 math 模塊中包含了各種浮點運算函數&#xff0c;包括&#xff1a; 函數功能floor向下取整ceil向上取整pow指數運算fabs絕對值sqrt開平方modf拆分小數和整數fsum計算列表中所有元素的累加和copysign復制符號pi圓周率e自然對數 2. math.floor(n) 函數 math.floor(n) 的…

6.14星期六休息一天

Hey guys, Today’s Saturday, and I didn’t have to go to work, so I let myself sleep in a bit — didn’t get up until 8 a.m. My cousin invited me over to his place. He lives in a nearby city, about 80 kilometers away. But honestly, after a long week, I …

event.target 詳解:理解事件目標對象

event.target 詳解&#xff1a;理解事件目標對象 在 JavaScript 事件處理中&#xff0c;event.target 是一個關鍵屬性&#xff0c;它表示最初觸發事件的 DOM 元素。下面我將通過一個可視化示例詳細解釋其工作原理和使用場景。 <!DOCTYPE html> <html lang"zh-C…

Flutter 小技巧之:實現 iOS 26 的 “液態玻璃”

隨著 iOS 26 發布&#xff0c;「液態玻璃」無疑是熱度最高的標簽&#xff0c;不僅僅是因為設計風格大變&#xff0c;更是因為 iOS 26 beta1 的各種 bug 帶來的毛坯感讓 iOS 26 沖上熱搜&#xff0c;比如通知中心和控制中心看起來就像是一個半成品&#xff1a; 當然&#xff0c;…

Android工程中FTP加密傳輸與非加密傳輸的深度解析

詳細的FTP傳輸實現方案&#xff0c;包括完整代碼、安全實踐、性能優化和實際應用場景分析。 一、FTP傳輸類型對比表&#xff08;增強版&#xff09; 特性非加密FTPFTPS (FTP over SSL/TLS)SFTP (SSH File Transfer Protocol)協議基礎FTP (RFC 959)FTP SSL/TLS (RFC 4217)SSH…