Docker 重要更新: 原生支持多階段構(gòu)建(multi-stage build)

Docker + alpine
Docker + alpine

Docker 的口號是 Build, Ship, and Run Any App, Anywhere.
但是我們在應(yīng)用過程中會遇到一個問題可训,我們在 build 的時候淘菩,把源碼也 build 進(jìn)去了呢袱。
然后就繼續(xù)把源碼 Ship 出去嗎?這可不行苇瓣。所有的編譯型語言都面臨這個困擾区匠。
即使是腳本型語言喧务,build 的時候也會使用很多上線時用不到的構(gòu)建工具仰税,
而我們希望減小生產(chǎn)鏡像的體積聚凹,這樣我們的小鯨魚才能多拉一點集裝箱嘛割坠。

傳統(tǒng)做法

我們最終的目的是要將編譯好的可執(zhí)行文件復(fù)制到 alpine 這樣的迷你鏡像里,
那么該怎么弄到編譯好的文件呢妒牙?基于 Docker 的思想彼哼,我們肯定需要在一個標(biāo)準(zhǔn)容器中編譯,
這樣這個過程才是標(biāo)準(zhǔn)化的湘今,再說敢朱,你在 Ubuntu 編譯出一個二進(jìn)制文件在 alpine 也運行不了。

于是我們先需要準(zhǔn)備一個編譯用的自定義鏡像摩瞎。一般是用相應(yīng)語言的 alpine 基礎(chǔ)鏡像拴签,
把編譯項目額外需要的各種工具打包進(jìn)去,比如 golang 目前沒有官方的包管理旗们,
你就需要把你用的包管理工具裝進(jìn)去蚓哩。

然后我們需要在運行 container 時把主機(jī)的一個目錄通過 -v 掛載到 container上,
讓它把編譯的結(jié)果輸出到這個掛載的目錄上渴,這樣我們就在主機(jī)上拿到這個文件了岸梨。

最后,我們用一個最小的 alpine 鏡像稠氮,把二進(jìn)制文件復(fù)制進(jìn)去曹阔。
可能你還需要設(shè)置一下時區(qū)之類的。

持續(xù)集成

上面的流程隔披,在用持續(xù)集成工具時又變成了一個問題赃份。你會發(fā)現(xiàn)每一家 CI 提供商都不太一樣。
你未必有權(quán)限控制 CI 時的宿主機(jī)奢米。

比如 Docker Cloud芥炭,你需要定義 pre-build 的 hook 去完成這個工作,
SEMAPHORE恃慧,你發(fā)現(xiàn)你有了一臺宿主機(jī),這下和我們在本地的做法可以一樣了渺蒿。
在更多的提供商痢士,你會發(fā)現(xiàn)他們只是能根據(jù) git 倉庫和 Dockerfile 構(gòu)建鏡像,
你用他們的系統(tǒng)甚至沒辦法做出一個最小鏡像……
中國的 DaoCloud 其實挺先進(jìn)的,很早就推出了安全鏡像的概念怠蹂,讓你的構(gòu)建通過兩步完成善延。
但是,那個配置的內(nèi)容太多讓不太懂的人看了直接暈掉城侧。

官方方案

在2017年5月3日即將發(fā)行的 Docker 17.05.0-ce 中易遣,Docker 官方提供了簡便的多階段構(gòu)建
(multi-stage build) 方案。我用例子為大家介紹下:

FROM muninn/glide:alpine AS build-env
ADD . /go/src/app
WORKDIR /go/src/app
RUN glide install
RUN go build -v -o /go/src/app/app-server

FROM alpine
RUN apk add -U tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
COPY --from=build-env /go/src/app/app-server /usr/local/bin/app-server
EXPOSE 80
CMD ["app-server"]

首先嫌佑,第一個 FROM 后邊多了個 AS 關(guān)鍵字豆茫,可以給這個階段起個名字。
我舉例子這個鏡像是官方
golang:alpine 加上構(gòu)建工具 glide 屋摇,我們照舊安裝依賴揩魂, build 出一個二進(jìn)制程序。

然后炮温,第二部分用了官方的 alpine 鏡像火脉,改變時區(qū)到中國,新特性體現(xiàn)在 COPY 關(guān)鍵字柒啤,
它現(xiàn)在可以接受 --from= 這樣的參數(shù)倦挂,從上個我們起名字的階段復(fù)制文件過來。

就這么簡單担巩,現(xiàn)在你只需要一個 Dockerfile 就什么都搞定了方援。

多項目構(gòu)建

于是現(xiàn)在你可以把好幾個項目的二進(jìn)制文件構(gòu)建在一個迷你鏡像中發(fā)布了,繼續(xù)舉個栗子:

from debian as build-essential
arg APT_MIRROR
run apt-get update
run apt-get install -y make gcc
workdir /src

from build-essential as foo
copy src1 .
run make

from build-essential as bar
copy src2 .
run make

from alpine
copy --from=foo bin1 .
copy --from=bar bin2 .
cmd ...

這個就是把兩個項目編譯出來的文件最終合并到了一個鏡像里兵睛。

好了肯骇,祝賀那些不支持多段構(gòu)建的 CI 服務(wù),Docker 幫你們追平了競爭對手祖很。
我有機(jī)會會寫一個支持 Docker 的 CI 的主觀評論笛丙,也歡迎大家吐槽各路 CI 給我提供素材。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末假颇,一起剝皮案震驚了整個濱河市胚鸯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笨鸡,老刑警劉巖姜钳,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異形耗,居然都是意外死亡哥桥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門激涤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拟糕,“玉大人,你說我怎么就攤上這事∷椭停” “怎么了侠草?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長犁嗅。 經(jīng)常有香客問我边涕,道長,這世上最難降的妖魔是什么褂微? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任功蜓,我火速辦了婚禮,結(jié)果婚禮上蕊梧,老公的妹妹穿的比我還像新娘霞赫。我一直安慰自己,他們只是感情好肥矢,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布端衰。 她就那樣靜靜地躺著,像睡著了一般甘改。 火紅的嫁衣襯著肌膚如雪旅东。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天十艾,我揣著相機(jī)與錄音抵代,去河邊找鬼。 笑死忘嫉,一個胖子當(dāng)著我的面吹牛荤牍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庆冕,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼康吵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了访递?” 一聲冷哼從身側(cè)響起晦嵌,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拷姿,沒想到半個月后惭载,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡响巢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年描滔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踪古。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡含长,死狀恐怖靶衍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茎芋,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布蜈出,位于F島的核電站田弥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铡原。R本人自食惡果不足惜偷厦,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望燕刻。 院中可真熱鬧只泼,春花似錦、人聲如沸卵洗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽过蹂。三九已至十绑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酷勺,已是汗流浹背本橙。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留脆诉,地道東北人甚亭。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像击胜,于是被迫代替她去往敵國和親亏狰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容