使用scratch構(gòu)建最小化Go程序的docker image

由于Golang編譯之后的文件是二進制长酗,而scratch是docker最基礎(chǔ)的空image溪北,所以可以使用scratch來構(gòu)建Go程序的docker image,使得最終構(gòu)建的image最小化.

構(gòu)建image過程分為兩步:

    1. 在Go基礎(chǔ)image中build.
    1. 將build好的二進制文件拷貝到scratch image中。

無需cgo的程序

對于無需cgo交叉編譯的程序之拨,使用scratch來作為最終運行的基礎(chǔ)image非常合適茉继。

首先,選擇合適版本的golang基礎(chǔ)image來build蚀乔,這里沒有必要選擇更小的golang alpine烁竭,build過程中pull一般會有緩存所以pull速度差別不大,此外alpine中沒有g(shù)it和ssl吉挣,我們在構(gòu)建image過程中都有可能用到派撕,況且alpine也不會影響最終image大小。

FROM golang:1.13 AS builder

禁掉cgo交叉編譯睬魂,我們服務(wù)器一般為linux amd64终吼,build二進制文件。

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /bin/appmain main.go

對于絕大多數(shù)go程序而言氯哮,是無需root來運行际跪,根據(jù)docker best practice,使用non-root來運行程序能夠帶來更好的安全性蛙粘,所以我們使用non-root用戶來運行垫卤,創(chuàng)建一個appuser威彰,之后再拷貝到scratch運行image中出牧。(scratch是空image,所以在builder中創(chuàng)建user歇盼,再拷貝舔痕。)

# 創(chuàng)建appuser
RUN groupadd -r appuser && useradd --no-log-init -r -g appuser appuser
...
# 拷貝appuser到scratch
COPY --from=builder /etc/passwd /etc/passwd
... 
# 選擇appuser為默認程序運行用戶
USER appuser

多數(shù)程序可能會用到ssl,我們將builder中的crt拷貝一下即可豹缀。(如果builder是alpine伯复,不能拷貝,需要在alpine中apk先預(yù)裝一下邢笙。)

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

完整版Dockerfile

FROM golang:1.13 AS builder
COPY . /app
WORKDIR /app
RUN groupadd -r appuser && useradd --no-log-init -r -g appuser appuser
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /bin/appmain main.go

FROM scratch
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /bin/appmain /bin/appmain
USER appuser
CMD [ "/bin/appmain" ]

需要cgo的程序

有些Go程序是需要cgo交叉編譯的啸如,例如ethereum. 對于需要cgo的程序,相對于scratch氮惯,更推薦使用alpine來作為基礎(chǔ)image叮雳,原因是alpine中帶有l(wèi)ibc,并且體積也才2MB多妇汗。而scratch中沒有帘不,當(dāng)然也可以在builder中l(wèi)dd依賴并拷貝到scratch中。只是用alpine會更方便一些杨箭。

在alpine中只要軟鏈接一下就可以使用寞焙。

RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

此外,創(chuàng)建non-root用戶的步驟也沒有必要在builder中進行了,可以直接在alpine中創(chuàng)建捣郊。

RUN addgroup -S appuser && adduser -S -G appuser appuser

完整版Dockerfile

FROM golang:1.13 AS builder
COPY . /app
WORKDIR /app
RUN go mod download
RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /bin/appmain main.go

FROM alpine:3.10
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /bin/appmain /bin/appmain
RUN addgroup -S appuser && adduser -S -G appuser appuser
USER appuser
CMD [ "/bin/appmain" ]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辽狈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呛牲,更是在濱河造成了極大的恐慌稻艰,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侈净,死亡現(xiàn)場離奇詭異尊勿,居然都是意外死亡,警方通過查閱死者的電腦和手機畜侦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門元扔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旋膳,你說我怎么就攤上這事澎语。” “怎么了验懊?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵擅羞,是天一觀的道長。 經(jīng)常有香客問我义图,道長减俏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任碱工,我火速辦了婚禮娃承,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怕篷。我一直安慰自己历筝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布廊谓。 她就那樣靜靜地躺著梳猪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒸痹。 梳的紋絲不亂的頭發(fā)上春弥,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音电抚,去河邊找鬼惕稻。 笑死,一個胖子當(dāng)著我的面吹牛蝙叛,可吹牛的內(nèi)容都是我干的俺祠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜘渣!你這毒婦竟也來了淌铐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蔫缸,失蹤者是張志新(化名)和其女友劉穎腿准,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拾碌,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吐葱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了校翔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弟跑。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖防症,靈堂內(nèi)的尸體忽然破棺而出孟辑,到底是詐尸還是另有隱情,我是刑警寧澤蔫敲,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布饲嗽,位于F島的核電站,受9級特大地震影響奈嘿,放射性物質(zhì)發(fā)生泄漏貌虾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一指么、第九天 我趴在偏房一處隱蔽的房頂上張望酝惧。 院中可真熱鬧榴鼎,春花似錦伯诬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至平项,卻和暖如春赫舒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闽瓢。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工接癌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扣讼。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓缺猛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荔燎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348