當前位置: 妍妍網 > 碼農

四個技巧,將 Docker 映像體積減小 90%

2024-06-24碼農

原文連結:https://cloud.tencent.com/developer/article/2407686

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

使用適當的基礎映像

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

使用多階段構建

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

使用多階段構建可以使得最終生成的映像只包含執行應用程式所必需的檔和依賴,而不包含構建過程中產生的不必要檔和依賴。以下是一個多階段構建的範例:

 # 構建階段1
FROM golang:1.17 AS builder
WORKDIR /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

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

往期推薦


  • 點亮,伺服器三年不宕機