国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

linkFly / 2358人閱讀

摘要:在更多的提供商,你會發現他們只是能根據倉庫和構建鏡像,你用他們的系統甚至沒辦法做出一個最小鏡像中國的其實挺先進的,很早就推出了安全鏡像的概念,讓你的構建通過兩步完成。好了,祝賀那些不支持多段構建的服務,幫你們追平了競爭對手。

Docker 的口號是 Build, Ship, and Run Any App, Anywhere.
但是我們在應用過程中會遇到一個問題,我們在 build 的時候,把源碼也 build 進去了。
然后就繼續把源碼 Ship 出去嗎?這可不行。所有的編譯型語言都面臨這個困擾。
即使是腳本型語言,build 的時候也會使用很多上線時用不到的構建工具,
而我們希望減小生產鏡像的體積,這樣我們的小鯨魚才能多拉一點集裝箱嘛。

傳統做法

我們最終的目的是要將編譯好的可執行文件復制到 alpine 這樣的迷你鏡像里,
那么該怎么弄到編譯好的文件呢?基于 Docker 的思想,我們肯定需要在一個標準容器中編譯,
這樣這個過程才是標準化的,再說,你在 Ubuntu 編譯出一個二進制文件在 alpine 也運行不了。

于是我們先需要準備一個編譯用的自定義鏡像。一般是用相應語言的 alpine 基礎鏡像,
把編譯項目額外需要的各種工具打包進去,比如 golang 目前沒有官方的包管理,
你就需要把你用的包管理工具裝進去。

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

最后,我們用一個最小的 alpine 鏡像,把二進制文件復制進去。
可能你還需要設置一下時區之類的。

持續集成

上面的流程,在用持續集成工具時又變成了一個問題。你會發現每一家 CI 提供商都不太一樣。
你未必有權限控制 CI 時的宿主機。

比如 Docker Cloud,你需要定義 pre-build 的 hook 去完成這個工作,
SEMAPHORE,你發現你有了一臺宿主機,這下和我們在本地的做法可以一樣了。
在更多的提供商,你會發現他們只是能根據 git 倉庫和 Dockerfile 構建鏡像,
你用他們的系統甚至沒辦法做出一個最小鏡像……
中國的 DaoCloud 其實挺先進的,很早就推出了安全鏡像的概念,讓你的構建通過兩步完成。
但是,那個配置的內容太多讓不太懂的人看了直接暈掉。

官方方案

在2017年5月3日即將發行的 Docker 17.05.0-ce 中,Docker 官方提供了簡便的多階段構建
(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 關鍵字,可以給這個階段起個名字。
我舉例子這個鏡像是官方
golang:alpine 加上構建工具 glide ,我們照舊安裝依賴, build 出一個二進制程序。

然后,第二部分用了官方的 alpine 鏡像,改變時區到中國,新特性體現在 COPY 關鍵字,
它現在可以接受 --from= 這樣的參數,從上個我們起名字的階段復制文件過來。

就這么簡單,現在你只需要一個 Dockerfile 就什么都搞定了。

多項目構建

于是現在你可以把好幾個項目的二進制文件構建在一個迷你鏡像中發布了,繼續舉個栗子:

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 ...

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

好了,祝賀那些不支持多段構建的 CI 服務,Docker 幫你們追平了競爭對手。
我有機會會寫一個支持 Docker 的 CI 的主觀評論,也歡迎大家吐槽各路 CI 給我提供素材。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26855.html

相關文章

  • Dockerfile打造你的自動化構建工具

    摘要:前言自動化構建是應用發布過程中必不可少的環節,常用的構建工具有等。當然,我推薦個人體驗的話就用官方的吧,因為這樣你構建的鏡像還可以與他人共享。 前言 自動化構建是應用發布過程中必不可少的環節, 常用的構建工具有jenkins ,walle 等。而這些工具在構建應用時通常會有以下問題: 需要直接或間接的寫一坨用于構建的shell命令等,不易管理、兼容性較差 上面一點可能還比較容易解決,...

    justCoding 評論0 收藏0
  • 給前端工程插上Docker的翅膀

    摘要:一個不包含的前端工程,是不會飛的,因此我們需要強行插上翅膀,即使你之前一把梭是多么的高效,這樣不僅僅是為了效率與可維護性,單單是從逼格的角度,你也應該盡快使用部署你的前端應用。 What Docker / Why Docker / Install Docker,請自行查閱相關資料。 一個不包含Docker的前端工程,是不會飛的,因此我們需要強行插上翅膀,即使你之前npm run bui...

    Anonymous1 評論0 收藏0
  • 給前端工程插上Docker的翅膀

    摘要:一個不包含的前端工程,是不會飛的,因此我們需要強行插上翅膀,即使你之前一把梭是多么的高效,這樣不僅僅是為了效率與可維護性,單單是從逼格的角度,你也應該盡快使用部署你的前端應用。 What Docker / Why Docker / Install Docker,請自行查閱相關資料。 一個不包含Docker的前端工程,是不會飛的,因此我們需要強行插上翅膀,即使你之前npm run bui...

    chadLi 評論0 收藏0
  • java篇 - 收藏集 - 掘金

    摘要:進階多線程開發關鍵技術后端掘金原創文章,轉載請務必將下面這段話置于文章開頭處保留超鏈接。關于中間件入門教程后端掘金前言中間件 Java 開發人員最常犯的 10 個錯誤 - 后端 - 掘金一 、把數組轉成ArrayList 為了將數組轉換為ArrayList,開發者經常... Java 9 中的 9 個新特性 - 后端 - 掘金Java 8 發布三年多之后,即將快到2017年7月下一個版...

    OpenDigg 評論0 收藏0
  • 容器環境下的持續集成最佳實踐:構建基于 Drone + GitFlow + K8s 的云原生語義化

    摘要:集成測試完成后,由運維同學從發起一個到分支,此時會會運行單元測試,構建鏡像,并發布到預發布環境測試人員在預發布環境下再次驗證功能,團隊做上線前的其他準備工作運維同學合并,將為本次發布的代碼及鏡像自動打上版本號并書寫,同時發布到生產環境。 云原生 (Cloud Native) 是伴隨的容器技術發展出現的的一個詞,最早出自 Pivotal 公司(即開發了 Spring 的公司)的一本技術小...

    asoren 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<