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

通過多階段構(gòu)建減小Golang鏡像的大小

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

我們?nèi)绾瓮ㄟ^引入具有多階段構(gòu)建過程的Dockerfiles來減小Golang鏡像的大小?

讓我們從一個通用的Dockerfile開始,它負(fù)責(zé)處理基本的事務(wù),如依賴項(xiàng)、構(gòu)建二進(jìn)制文件、暴露必要的端口等,以便為Go中的一個非常基礎(chǔ)的REST API提供服務(wù)。

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"]

那將無縫地構(gòu)建您項(xiàng)目的二進(jìn)制文件,并創(chuàng)建Docker鏡像。

這樣做真的足夠好嗎? 我會說不,因?yàn)樯傻溺R像大小超過300MB(確切地說是322MB),因?yàn)樗怂械腉olang工具,這對我們來說是不必要的,因?yàn)槲覀冎甘揪幾g器禁用cgo(CGO_ENABLED=0)并靜態(tài)鏈接任何將為我們提供自包含可執(zhí)行文件的C綁定(其大小僅為6.05MB!),無需任何外部框架或運(yùn)行時依賴。

圖片圖片

CGO_ENABLED=0 是至關(guān)重要的,如果我們不構(gòu)建自包含的可執(zhí)行文件,多階段構(gòu)建過程將無法工作。

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

# 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工具包的 已被清理。現(xiàn)在鏡像大小已降至11.7MB。

圖片圖片

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

# 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"]

新創(chuàng)建的鏡像現(xiàn)在已經(jīng)降至6.34MB!

圖片圖片

因?yàn)槲覀冾A(yù)先告知的scratch鏡像實(shí)際上是空的,所以找不到任何根SSL證書。以下指令將在最終鏡像中復(fù)制證書,絕對不應(yīng)被省略:

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

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


責(zé)任編輯:武曉燕 來源: 云原生運(yùn)維圈
相關(guān)推薦

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

2023-04-09 16:31:30

Phaser工具Java

2022-11-03 10:28:43

Docker

2020-03-30 21:32:50

物聯(lián)網(wǎng)IOT多階段驗(yàn)證

2024-10-24 23:49:42

2023-12-04 16:18:30

2023-12-29 07:04:28

Go項(xiàng)目Docker編寫

2025-03-26 02:00:00

C#Docker開發(fā)

2019-06-05 10:27:26

UCloud徐亮

2025-02-06 08:37:38

2022-03-28 08:41:27

惡意軟件勒索軟件網(wǎng)絡(luò)攻擊

2022-09-08 18:41:34

惡意軟件ShikitegaLinux

2020-06-08 14:44:56

SIM卡攻擊交換攻擊

2014-04-02 09:56:13

iOS應(yīng)用減小安裝包
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91在线看视频 | 二区视频| 久久久久国产精品www | 夜久久 | 国产成人免费视频网站视频社区 | 色综合一区二区 | 国产夜恋视频在线观看 | 久久久久久国产精品三区 | 国产精品美女久久久久久久网站 | 国产成人av在线播放 | 欧美色999 | 亚欧洲精品在线视频免费观看 | 亚洲一区中文字幕 | 日韩视频专区 | 日韩福利 | 欧美一区视频 | 在线观看av网站 | 伊人网在线看 | 日韩精品一区二区三区在线观看 | 中文字幕日韩欧美一区二区三区 | 亚洲视频国产视频 | 亚洲精品一区久久久久久 | 国产精品久久 | 国产亚洲一级 | 欧美一区二区三区 | 国产欧美一区二区三区久久人妖 | 日韩毛片在线观看 | 久久久久网站 | 国产偷录叫床高潮录音 | 精品一二 | 日本特黄a级高清免费大片 成年人黄色小视频 | 中文字幕乱码视频32 | 亚洲久视频 | 老牛嫩草一区二区三区av | 亚洲一区二区三区国产 | 精品久久国产 | 久久久99精品免费观看 | 日韩中文字幕2019 | 日本不卡一区二区三区在线观看 | 91视频免费视频 | 黄色成人免费在线观看 |