成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

通過多階段構建減小Golang鏡像的大小

開發 前端
多階段構建允許多個不同的構建過程,這些構建可以完全從不同的基礎鏡像構建,選擇性地將文件從一個階段傳遞到下一個階段,從而剝離最終鏡像中所有不必要的文件。例如,我們可以將前一個階段稱為BUILD,然后引入第二個階段,我們稱之為BINARIES,該階段使用alpine:latest作為基礎鏡像,并從BUILD階段復制我們構建的應用程序的二進制文件。

我們如何通過引入具有多階段構建過程的Dockerfiles來減小Golang鏡像的大小?

讓我們從一個通用的Dockerfile開始,它負責處理基本的事務,如依賴項、構建二進制文件、暴露必要的端口等,以便為Go中的一個非常基礎的REST API提供服務。

FROM golang:1.16-alpine
ENV GO111MODULE=on
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
ENV HTTP_PORT=8080
EXPOSE 8080
ENTRYPOINT ["/app/reduce-docker-size"]

那將無縫地構建您項目的二進制文件,并創建Docker鏡像。

這樣做真的足夠好嗎? 我會說不,因為生成的鏡像大小超過300MB(確切地說是322MB),因為它包含了所有的Golang工具,這對我們來說是不必要的,因為我們指示編譯器禁用cgo(CGO_ENABLED=0)并靜態鏈接任何將為我們提供自包含可執行文件的C綁定(其大小僅為6.05MB!),無需任何外部框架或運行時依賴。

圖片圖片

CGO_ENABLED=0 是至關重要的,如果我們不構建自包含的可執行文件,多階段構建過程將無法工作。

我們可以做得更好的是,采用所謂的多階段構建。多階段構建允許多個不同的構建過程,這些構建可以完全從不同的基礎鏡像構建,選擇性地將文件從一個階段傳遞到下一個階段,從而剝離最終鏡像中所有不必要的文件。例如,我們可以將前一個階段稱為BUILD,然后引入第二個階段,我們稱之為BINARIES,該階段使用alpine:latest作為基礎鏡像,并從BUILD階段復制我們構建的應用程序的二進制文件。

# BUILD
FROM golang:1.16-alpine as BUILD
ENV GO111MODULE=on
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
ENV HTTP_PORT=8080
EXPOSE 8080
# BINARIES
FROM alpine:latest
COPY --from=BUILD /app/reduce-docker-size /app/reduce-docker-size
ENTRYPOINT ["/app/reduce-docker-size"]

由于不再需要,配備了golang工具包的 已被清理。現在鏡像大小已降至11.7MB。

圖片圖片

這個好到足夠了嗎? 我會說是的,但是為了實驗的緣故,我們還是盡量挑戰一下極限。我們繼續沿著多階段構建的道路前進,但這次在我們的第二階段,我們將不再使用alpine:latest,而是轉向一個非常特殊的名為scratch的鏡像,這是一個完全空白的鏡像,實際上什么都沒有。

# BUILD
FROM golang:1.16-alpine as BUILD
ENV GO111MODULE=on
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
ENV HTTP_PORT=8080
EXPOSE 8080
# MINIATURE
FROM scratch
COPY --from=BUILD /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=BUILD /app/reduce-docker-size /app/reduce-docker-size
ENTRYPOINT ["/app/reduce-docker-size"]

新創建的鏡像現在已經降至6.34MB!

圖片圖片

因為我們預先告知的scratch鏡像實際上是空的,所以找不到任何根SSL證書。以下指令將在最終鏡像中復制證書,絕對不應被省略:

COPY — from=BUILD /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

請問使用scratch作為最終階段的基礎鏡像值得嗎?我會說既值得又不值得。如果你排除一些特殊情況——那些在alpine:latest和scratch構建的最終鏡像之間的5.36MB差異可能會產生巨大的影響——在其余的情況下,你最終會在生產中得到一個完全沒有任何工具的容器,我完全不推薦這樣做。這些特殊情況很少見,所以在為了僅僅5.36M。


責任編輯:武曉燕 來源: 云原生運維圈
相關推薦

2023-07-03 08:52:31

容器Golang

2017-11-13 17:17:11

Docker鏡像Go

2023-02-08 13:08:31

2025-03-20 10:07:55

2017-11-21 14:34:30

2022-11-03 10:28:43

Docker

2023-04-09 16:31:30

Phaser工具Java

2020-03-30 21:32:50

物聯網IOT多階段驗證

2024-10-24 23:49:42

2023-12-04 16:18:30

2023-12-29 07:04:28

Go項目Docker編寫

2025-03-26 02:00:00

C#Docker開發

2025-02-06 08:37:38

2019-06-05 10:27:26

UCloud徐亮

2022-03-28 08:41:27

惡意軟件勒索軟件網絡攻擊

2022-09-08 18:41:34

惡意軟件ShikitegaLinux

2020-06-08 14:44:56

SIM卡攻擊交換攻擊

2014-04-02 09:56:13

iOS應用減小安裝包
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91最新入口 | 久久久日韩精品一区二区三区 | 日韩在线播放视频 | 91久久国产综合久久 | 国产精品观看 | 91久久国产 | 成人性视频免费网站 | 精品人伦一区二区三区蜜桃网站 | 亚洲一区二区精品视频 | 国产成人精品一区二区三区网站观看 | 久久99视频这里只有精品 | 国产激情在线观看视频 | 亚洲精品欧美 | 日日日日日日bbbbb视频 | 久久久久久国产精品免费免费男同 | 久久91精品国产一区二区三区 | 在线色网址 | 欧美一区二区在线播放 | www.中文字幕av | 台湾a级理论片在线观看 | 国产午夜视频 | 日韩一区二区久久 | 午夜免费av| 日韩在线视频一区 | 成人影院在线视频 | 日韩视频在线观看一区二区 | 成人午夜免费在线视频 | 日本一区二区三区在线观看 | 999久久久久久久久6666 | 久久久婷 | 亚洲一区二区久久久 | 嫩草网 | 精品久久久久久18免费网站 | 黄毛片| 999国产精品视频 | 欧美a级成人淫片免费看 | 色播视频在线观看 | 浮生影院免费观看中文版 | 久久久久久天堂 | 一区二区三区久久 | 色综合久久伊人 |