docker中多階段構(gòu)建與單階段構(gòu)建的具體使用
單階段構(gòu)建(Single-Stage Build)
在單階段構(gòu)建中,所有構(gòu)建過(guò)程都在一個(gè)鏡像中完成。構(gòu)建工具和最終的運(yùn)行時(shí)環(huán)境都包含在同一個(gè)鏡像中,導(dǎo)致最終鏡像的體積較大。
單階段構(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 // 使用中國(guó)的 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)缺點(diǎn):
- 優(yōu)點(diǎn):
- 構(gòu)建過(guò)程簡(jiǎn)單,只有一個(gè)階段。
- 缺點(diǎn):
- 最終鏡像包含構(gòu)建工具(如
go工具鏈),使鏡像體積較大。 - 不適合生產(chǎn)環(huán)境,因?yàn)殓R像中包含了構(gòu)建相關(guān)的工具和源代碼,可能帶來(lái)安全問(wèn)題。
- 運(yùn)行時(shí)環(huán)境包含不必要的構(gòu)建工具和依賴(lài),增加了攻擊面和容器的啟動(dòng)時(shí)間。
- 最終鏡像包含構(gòu)建工具(如
多階段構(gòu)建(Multi-Stage Build)
在多階段構(gòu)建中,構(gòu)建過(guò)程被分成多個(gè)階段。每個(gè)階段可以使用不同的基礎(chǔ)鏡像,最終鏡像只包含必要的運(yùn)行時(shí)環(huán)境和構(gòu)建完成的二進(jìn)制文件。
這種方法的好處是可以顯著減小最終鏡像的體積,同時(shí)避免將不必要的構(gòu)建工具和依賴(lài)包含在生產(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 // 使用中國(guó)的 Go 代理,確保更快速的包下載 RUN go mod tidy RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app . # 第二階段:運(yùn)行 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)缺點(diǎn):
- 優(yōu)點(diǎn):
- 可以有效減少最終鏡像的體積,只包含運(yùn)行時(shí)環(huán)境和必要的二進(jìn)制文件。
- 可以選擇不同的鏡像來(lái)進(jìn)行不同的構(gòu)建步驟,例如使用
golang鏡像構(gòu)建代碼,使用更小的alpine鏡像運(yùn)行應(yīng)用。 - 避免了構(gòu)建工具和源代碼暴露在最終鏡像中,提高了安全性。
- 缺點(diǎn):
- Dockerfile 更復(fù)雜,因?yàn)樾枰獮椴煌碾A段指定不同的鏡像。
- 構(gòu)建過(guò)程較為冗長(zhǎng),需要多個(gè)階段來(lái)完成構(gòu)建和運(yùn)行,可能稍微增加構(gòu)建時(shí)間。
對(duì)比總結(jié)
單階段構(gòu)建:構(gòu)建和運(yùn)行都在同一個(gè)鏡像中完成,最終鏡像較大,包含了構(gòu)建工具和源代碼。
- 適合小型項(xiàng)目或快速開(kāi)發(fā),但不適合生產(chǎn)環(huán)境。
- 鏡像較大,不適合持續(xù)交付或生產(chǎn)環(huán)境部署。
多階段構(gòu)建:將構(gòu)建過(guò)程分為多個(gè)階段,最終鏡像只包含需要的運(yùn)行時(shí)環(huán)境和構(gòu)建完成的二進(jìn)制文件。
- 適合生產(chǎn)環(huán)境,能夠減小鏡像體積,避免不必要的構(gòu)建工具暴露在鏡像中。
- 更適合復(fù)雜項(xiàng)目或?qū)︾R像大小、安全性有較高要求的場(chǎng)景。
到此這篇關(guān)于docker中多階段構(gòu)建與單階段構(gòu)建的具體使用的文章就介紹到這了,更多相關(guān)docker 多階段構(gòu)建與單階段構(gòu)建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker安裝Redis高可用實(shí)現(xiàn)一主二從三哨兵
redis提供了哨兵模式保證redis實(shí)現(xiàn)高可用,本文主要介紹了docker安裝Redis高可用實(shí)現(xiàn)一主二從三哨兵,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
解決docker掛載的目錄無(wú)法讀寫(xiě)問(wèn)題
這篇文章主要介紹了解決docker掛載的目錄無(wú)法讀寫(xiě)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
從Docker容器中備份整個(gè)PostgreSQL的操作步驟
現(xiàn)在需要從Docker容器中備份整個(gè)PostgreSQL后,然后,使用備份文件在另外一個(gè)pg的docker容器中恢復(fù)過(guò)來(lái),所以本文給大家介紹了從Docker容器中備份整個(gè)PostgreSQL的操作步驟,通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-10-10
docker安裝Jenkins執(zhí)行構(gòu)建jar運(yùn)行方式
這篇文章主要介紹了docker安裝Jenkins執(zhí)行構(gòu)建jar運(yùn)行方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Docker鏡像+nginx 部署 vue 項(xiàng)目的方法
這篇文章主要介紹了Docker鏡像+nginx 部署 vue 項(xiàng)目的方法,幫助大家更好的使用docke鏡像,感興趣的朋友可以了解下2020-10-10
docker創(chuàng)建離線(xiàn)鏡像包的實(shí)現(xiàn)步驟
本文主要介紹了docker創(chuàng)建離線(xiàn)鏡像包的實(shí)現(xiàn)步驟,推薦了docker.m.daocloud.io和hub.openeeds.com,具有一定的參考價(jià)值,感興趣的可以了解一下2025-06-06

