docker中多階段構(gòu)建與單階段構(gòu)建的具體使用
單階段構(gòu)建(Single-Stage Build)
在單階段構(gòu)建中,所有構(gòu)建過程都在一個鏡像中完成。構(gòu)建工具和最終的運行時環(huán)境都包含在同一個鏡像中,導致最終鏡像的體積較大。
單階段構(gòu)建 Dockerfile 示例:
FROM golang:1.18 WORKDIR /app COPY ./helloworld /app/ // 設(shè)置 Go 代理環(huán)境變量 ENV GO111MODULE=on ENV GOPROXY=https://goproxy.cn,direct // 使用中國的 Go 代理,確保更快速的包下載 RUN go mod tidy RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app . EXPOSE 80 CMD ["./app", "--param1=p1", "--param2=p2"]
優(yōu)缺點:
- 優(yōu)點:
- 構(gòu)建過程簡單,只有一個階段。
- 缺點:
- 最終鏡像包含構(gòu)建工具(如
go工具鏈),使鏡像體積較大。 - 不適合生產(chǎn)環(huán)境,因為鏡像中包含了構(gòu)建相關(guān)的工具和源代碼,可能帶來安全問題。
- 運行時環(huán)境包含不必要的構(gòu)建工具和依賴,增加了攻擊面和容器的啟動時間。
- 最終鏡像包含構(gòu)建工具(如
多階段構(gòu)建(Multi-Stage Build)
在多階段構(gòu)建中,構(gòu)建過程被分成多個階段。每個階段可以使用不同的基礎(chǔ)鏡像,最終鏡像只包含必要的運行時環(huán)境和構(gòu)建完成的二進制文件。
這種方法的好處是可以顯著減小最終鏡像的體積,同時避免將不必要的構(gòu)建工具和依賴包含在生產(chǎn)環(huán)境的鏡像中。
多階段構(gòu)建 Dockerfile 示例:
# 第一階段:構(gòu)建 Go 應(yīng)用 FROM golang:1.18 AS builder WORKDIR /go/src/helloworld COPY ./helloworld /go/src/helloworld // 設(shè)置 Go 代理環(huán)境變量 ENV GO111MODULE=on ENV GOPROXY=https://goproxy.cn,direct // 使用中國的 Go 代理,確保更快速的包下載 RUN go mod tidy RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app . # 第二階段:運行 Go 應(yīng)用 FROM alpine:latest WORKDIR /app COPY --from=builder /go/src/helloworld/app /app/ EXPOSE 80 CMD ["./app", "--param1=p1", "--param2=p2"]
優(yōu)缺點:
- 優(yōu)點:
- 可以有效減少最終鏡像的體積,只包含運行時環(huán)境和必要的二進制文件。
- 可以選擇不同的鏡像來進行不同的構(gòu)建步驟,例如使用
golang鏡像構(gòu)建代碼,使用更小的alpine鏡像運行應(yīng)用。 - 避免了構(gòu)建工具和源代碼暴露在最終鏡像中,提高了安全性。
- 缺點:
- Dockerfile 更復雜,因為需要為不同的階段指定不同的鏡像。
- 構(gòu)建過程較為冗長,需要多個階段來完成構(gòu)建和運行,可能稍微增加構(gòu)建時間。
對比總結(jié)
單階段構(gòu)建:構(gòu)建和運行都在同一個鏡像中完成,最終鏡像較大,包含了構(gòu)建工具和源代碼。
- 適合小型項目或快速開發(fā),但不適合生產(chǎn)環(huán)境。
- 鏡像較大,不適合持續(xù)交付或生產(chǎn)環(huán)境部署。
多階段構(gòu)建:將構(gòu)建過程分為多個階段,最終鏡像只包含需要的運行時環(huán)境和構(gòu)建完成的二進制文件。
- 適合生產(chǎn)環(huán)境,能夠減小鏡像體積,避免不必要的構(gòu)建工具暴露在鏡像中。
- 更適合復雜項目或?qū)︾R像大小、安全性有較高要求的場景。
到此這篇關(guān)于docker中多階段構(gòu)建與單階段構(gòu)建的具體使用的文章就介紹到這了,更多相關(guān)docker 多階段構(gòu)建與單階段構(gòu)建內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker安裝Redis高可用實現(xiàn)一主二從三哨兵
redis提供了哨兵模式保證redis實現(xiàn)高可用,本文主要介紹了docker安裝Redis高可用實現(xiàn)一主二從三哨兵,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2024-02-02
docker安裝Jenkins執(zhí)行構(gòu)建jar運行方式
這篇文章主要介紹了docker安裝Jenkins執(zhí)行構(gòu)建jar運行方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
docker創(chuàng)建離線鏡像包的實現(xiàn)步驟
本文主要介紹了docker創(chuàng)建離線鏡像包的實現(xiàn)步驟,推薦了docker.m.daocloud.io和hub.openeeds.com,具有一定的參考價值,感興趣的可以了解一下2025-06-06

