摘要:在更多的提供商,你會發(fā)現(xiàn)他們只是能根據(jù)倉庫和構(gòu)建鏡像,你用他們的系統(tǒng)甚至沒辦法做出一個(gè)最小鏡像中國的其實(shí)挺先進(jìn)的,很早就推出了安全鏡像的概念,讓你的構(gòu)建通過兩步完成。好了,祝賀那些不支持多段構(gòu)建的服務(wù),幫你們追平了競爭對手。
Docker 的口號是 Build, Ship, and Run Any App, Anywhere.
但是我們在應(yīng)用過程中會遇到一個(gè)問題,我們在 build 的時(shí)候,把源碼也 build 進(jìn)去了。
然后就繼續(xù)把源碼 Ship 出去嗎?這可不行。所有的編譯型語言都面臨這個(gè)困擾。
即使是腳本型語言,build 的時(shí)候也會使用很多上線時(shí)用不到的構(gòu)建工具,
而我們希望減小生產(chǎn)鏡像的體積,這樣我們的小鯨魚才能多拉一點(diǎn)集裝箱嘛。
我們最終的目的是要將編譯好的可執(zhí)行文件復(fù)制到 alpine 這樣的迷你鏡像里,
那么該怎么弄到編譯好的文件呢?基于 Docker 的思想,我們肯定需要在一個(gè)標(biāo)準(zhǔn)容器中編譯,
這樣這個(gè)過程才是標(biāo)準(zhǔn)化的,再說,你在 Ubuntu 編譯出一個(gè)二進(jìn)制文件在 alpine 也運(yùn)行不了。
于是我們先需要準(zhǔn)備一個(gè)編譯用的自定義鏡像。一般是用相應(yīng)語言的 alpine 基礎(chǔ)鏡像,
把編譯項(xiàng)目額外需要的各種工具打包進(jìn)去,比如 golang 目前沒有官方的包管理,
你就需要把你用的包管理工具裝進(jìn)去。
然后我們需要在運(yùn)行 container 時(shí)把主機(jī)的一個(gè)目錄通過 -v 掛載到 container上,
讓它把編譯的結(jié)果輸出到這個(gè)掛載的目錄,這樣我們就在主機(jī)上拿到這個(gè)文件了。
最后,我們用一個(gè)最小的 alpine 鏡像,把二進(jìn)制文件復(fù)制進(jìn)去。
可能你還需要設(shè)置一下時(shí)區(qū)之類的。
上面的流程,在用持續(xù)集成工具時(shí)又變成了一個(gè)問題。你會發(fā)現(xiàn)每一家 CI 提供商都不太一樣。
你未必有權(quán)限控制 CI 時(shí)的宿主機(jī)。
比如 Docker Cloud,你需要定義 pre-build 的 hook 去完成這個(gè)工作,
在 SEMAPHORE,你發(fā)現(xiàn)你有了一臺宿主機(jī),這下和我們在本地的做法可以一樣了。
在更多的提供商,你會發(fā)現(xiàn)他們只是能根據(jù) git 倉庫和 Dockerfile 構(gòu)建鏡像,
你用他們的系統(tǒng)甚至沒辦法做出一個(gè)最小鏡像……
中國的 DaoCloud 其實(shí)挺先進(jìn)的,很早就推出了安全鏡像的概念,讓你的構(gòu)建通過兩步完成。
但是,那個(gè)配置的內(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"]
首先,第一個(gè) FROM 后邊多了個(gè) AS 關(guān)鍵字,可以給這個(gè)階段起個(gè)名字。
我舉例子這個(gè)鏡像是官方
golang:alpine 加上構(gòu)建工具 glide ,我們照舊安裝依賴, build 出一個(gè)二進(jìn)制程序。
然后,第二部分用了官方的 alpine 鏡像,改變時(shí)區(qū)到中國,新特性體現(xiàn)在 COPY 關(guān)鍵字,
它現(xiàn)在可以接受 --from= 這樣的參數(shù),從上個(gè)我們起名字的階段復(fù)制文件過來。
就這么簡單,現(xiàn)在你只需要一個(gè) Dockerfile 就什么都搞定了。
多項(xiàng)目構(gòu)建于是現(xiàn)在你可以把好幾個(gè)項(xiàng)目的二進(jìn)制文件構(gòu)建在一個(gè)迷你鏡像中發(fā)布了,繼續(xù)舉個(gè)栗子:
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è)就是把兩個(gè)項(xiàng)目編譯出來的文件最終合并到了一個(gè)鏡像里。
好了,祝賀那些不支持多段構(gòu)建的 CI 服務(wù),Docker 幫你們追平了競爭對手。
我有機(jī)會會寫一個(gè)支持 Docker 的 CI 的主觀評論,也歡迎大家吐槽各路 CI 給我提供素材。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26855.html
摘要:前言自動化構(gòu)建是應(yīng)用發(fā)布過程中必不可少的環(huán)節(jié),常用的構(gòu)建工具有等。當(dāng)然,我推薦個(gè)人體驗(yàn)的話就用官方的吧,因?yàn)檫@樣你構(gòu)建的鏡像還可以與他人共享。 前言 自動化構(gòu)建是應(yīng)用發(fā)布過程中必不可少的環(huán)節(jié), 常用的構(gòu)建工具有jenkins ,walle 等。而這些工具在構(gòu)建應(yīng)用時(shí)通常會有以下問題: 需要直接或間接的寫一坨用于構(gòu)建的shell命令等,不易管理、兼容性較差 上面一點(diǎn)可能還比較容易解決,...
摘要:一個(gè)不包含的前端工程,是不會飛的,因此我們需要強(qiáng)行插上翅膀,即使你之前一把梭是多么的高效,這樣不僅僅是為了效率與可維護(hù)性,單單是從逼格的角度,你也應(yīng)該盡快使用部署你的前端應(yīng)用。 What Docker / Why Docker / Install Docker,請自行查閱相關(guān)資料。 一個(gè)不包含Docker的前端工程,是不會飛的,因此我們需要強(qiáng)行插上翅膀,即使你之前npm run bui...
摘要:一個(gè)不包含的前端工程,是不會飛的,因此我們需要強(qiáng)行插上翅膀,即使你之前一把梭是多么的高效,這樣不僅僅是為了效率與可維護(hù)性,單單是從逼格的角度,你也應(yīng)該盡快使用部署你的前端應(yīng)用。 What Docker / Why Docker / Install Docker,請自行查閱相關(guān)資料。 一個(gè)不包含Docker的前端工程,是不會飛的,因此我們需要強(qiáng)行插上翅膀,即使你之前npm run bui...
摘要:進(jìn)階多線程開發(fā)關(guān)鍵技術(shù)后端掘金原創(chuàng)文章,轉(zhuǎn)載請務(wù)必將下面這段話置于文章開頭處保留超鏈接。關(guān)于中間件入門教程后端掘金前言中間件 Java 開發(fā)人員最常犯的 10 個(gè)錯誤 - 后端 - 掘金一 、把數(shù)組轉(zhuǎn)成ArrayList 為了將數(shù)組轉(zhuǎn)換為ArrayList,開發(fā)者經(jīng)常... Java 9 中的 9 個(gè)新特性 - 后端 - 掘金Java 8 發(fā)布三年多之后,即將快到2017年7月下一個(gè)版...
摘要:集成測試完成后,由運(yùn)維同學(xué)從發(fā)起一個(gè)到分支,此時(shí)會會運(yùn)行單元測試,構(gòu)建鏡像,并發(fā)布到預(yù)發(fā)布環(huán)境測試人員在預(yù)發(fā)布環(huán)境下再次驗(yàn)證功能,團(tuán)隊(duì)做上線前的其他準(zhǔn)備工作運(yùn)維同學(xué)合并,將為本次發(fā)布的代碼及鏡像自動打上版本號并書寫,同時(shí)發(fā)布到生產(chǎn)環(huán)境。 云原生 (Cloud Native) 是伴隨的容器技術(shù)發(fā)展出現(xiàn)的的一個(gè)詞,最早出自 Pivotal 公司(即開發(fā)了 Spring 的公司)的一本技術(shù)小...
閱讀 1151·2023-04-26 03:02
閱讀 1191·2023-04-25 19:18
閱讀 2595·2021-11-23 09:51
閱讀 2577·2021-11-11 16:55
閱讀 2631·2021-10-21 09:39
閱讀 1710·2021-10-09 09:59
閱讀 2005·2021-09-26 09:55
閱讀 3532·2021-09-26 09:55