利用Makisu構(gòu)建容器鏡像

本系列文章深入研究了容器鏡像構(gòu)建的最新技術(shù)。我們已經(jīng)介紹了Podman和Buildah、Img、Kaniko,而這次輪到Makisu了。 Makisu是另一個(gè)開源鏡像構(gòu)建工具,由Uber的工程團(tuán)隊(duì)構(gòu)思而成。像許多其他開源項(xiàng)目一樣,Makisu也是基于其他類似技術(shù)的不足而開發(fā)的。 Makisu尤其專注于優(yōu)化鏡像構(gòu)建時(shí)間和大小。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供管城企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、做網(wǎng)站、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為管城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

使用Makisu** 類似Kaniko,Makisu不會(huì)調(diào)用容器并依據(jù)Dockerfile指令在容器中構(gòu)建鏡像。它既可以作為獨(dú)立的二進(jìn)制文件在本地運(yùn)行,也可以作為沙箱運(yùn)行在容器內(nèi)。但是,由于它無(wú)法執(zhí)行RUN Dockerfile指令,因此它作為獨(dú)立二進(jìn)制文件的用途受到限制。當(dāng)然,你也不希望Makisu通過(guò)RUN指令更改主機(jī)的本地文件系統(tǒng)內(nèi)容! 實(shí)際上Makisu不允許更改本地文件;你需要指定標(biāo)志--modifyfs = true,以允許使用命令對(duì)文件系統(tǒng)進(jìn)行更改。

但請(qǐng)注意,如果使用--modifyfs = true運(yùn)行獨(dú)立的Makisu二進(jìn)制文件,最終將刪除主機(jī)的許多rootfs。 Makisu被設(shè)計(jì)為在容器中運(yùn)行,在容器中更改文件系統(tǒng)內(nèi)容是安全的。 實(shí)際上用于執(zhí)行構(gòu)建的Makisu本身的容器鏡像很少。它是基于基本圖像指令(scratch base image directive)構(gòu)建的,僅包含Makisu二進(jìn)制文件和根CA證書的文件。

需要使用卷將構(gòu)建上下文(包括Dockerfile)提供給容器。 Makisu提取Dockerfile中定義的基本鏡像,并將其文件系統(tǒng)提取到其容器內(nèi)。它還將此文件系統(tǒng)的副本存儲(chǔ)在內(nèi)存中。

隨后的構(gòu)建步驟針對(duì)該文件系統(tǒng)的內(nèi)容運(yùn)行,然后對(duì)其進(jìn)行掃描以查找更改。任何更改也會(huì)反映在“內(nèi)存”的副本中,并創(chuàng)建一個(gè)包含更改的新“差異層”。 “差異層”層緩存在目錄中,以供將來(lái)的版本使用,前提是用于存儲(chǔ)的卷已經(jīng)被掛載。 Dockerfile中定義的構(gòu)建步驟以這種方式執(zhí)行到完成,然后Makisu將構(gòu)建的鏡像推送到容器鏡像倉(cāng)庫(kù)(如果已指定)。如果將Docker用作Makisu的容器運(yùn)行時(shí),則可以使用以下命令調(diào)用構(gòu)建容器: ``` $ docker run --rm \ -v $(pwd):/makisu-context \ -v /tmp/makisu-storage:/makisu-storage \ gcr.io/makisu-project/makisu:v0.1.12 build \ --tag=mycorp/my-app:1d03df1 \ --push=quay.io \ --modifyfs=true \ /makisu-context ``` 如果你閱讀了本系列的上一篇文章,你將已經(jīng)得出結(jié)論,如Kaniko一樣,Makisu將采用幾乎相同的方法來(lái)構(gòu)建鏡像。

你可以執(zhí)行構(gòu)建步驟而無(wú)需Docker守護(hù)程序,也無(wú)需運(yùn)行嵌套容器所需的特權(quán)賬號(hào)。但是 Makisu的突出之處在于其構(gòu)建緩存實(shí)現(xiàn)的方法。 **緩存** 一旦決定放棄Docker守護(hù)進(jìn)程構(gòu)建鏡像,你將失去其固有的緩存功能。 Docker守護(hù)程序提供的構(gòu)建步驟緩存可能不像許多人所希望的那樣具有豐富的功能,但是緩存是鏡像構(gòu)建的基本功能。通過(guò)復(fù)用以前執(zhí)行過(guò)的相同構(gòu)建步驟所生成的內(nèi)容,它有助于優(yōu)化構(gòu)建時(shí)間。對(duì)于Uber來(lái)說(shuō),這是促使他們決定創(chuàng)建替代容器鏡像構(gòu)建工具的重要因素之一。那么,Makisu通過(guò)緩存功能提供了什么?

分布式緩存

在Kubernetes設(shè)置中,包含構(gòu)建容器的Pod在理論上可以存在于集群內(nèi)的任何節(jié)點(diǎn)上。 這帶來(lái)了一個(gè)問(wèn)題:構(gòu)建容器如何才能利用先前構(gòu)建迭代生成的緩存鏡像層? 我們可以嘗試迫使Pod落在執(zhí)行了先前構(gòu)建迭代的節(jié)點(diǎn)上,但這會(huì)影響調(diào)度程序的作用和目的。相反,Makisu利用分布式緩存來(lái)解決此問(wèn)題。

首先,Makisu提供了Dockerfile指令序列和diff層摘要之間的本地映射。這些映射保存在鍵值存儲(chǔ)中,鍵值存儲(chǔ)可以是文件,分布式Redis緩存或基于HTTP的通用緩存。重要的是緩存是分布式的,因此可以由任何有權(quán)訪問(wèn)緩存的Makisu構(gòu)建容器引用。 緩存中的映射使Makisu能夠確定是否需要執(zhí)行現(xiàn)有的構(gòu)建步驟,或者是否可以使用現(xiàn)有層的內(nèi)容。如果在緩存中找到匹配項(xiàng),則可以從Makisu管理的本地存儲(chǔ)中解壓縮該圖層(如果它存在于本地存儲(chǔ)中),或者從鏡像倉(cāng)庫(kù)中提取該圖層(如果已推送先前的構(gòu)建)。

緩存中的密鑰是從Dockerfile指令生成的,用于構(gòu)建步驟并與先前構(gòu)建步驟相關(guān)聯(lián)。關(guān)聯(lián)值是先前生成的鏡像層內(nèi)容的哈希值。如果構(gòu)建步驟指令序列與緩存中的現(xiàn)有鍵匹配,則Makisu將使用摘要(作為鍵值保存)來(lái)定位diff層。 緩存具有可配置的生存時(shí)間(TTL),以確保緩存的圖層不會(huì)過(guò)時(shí)。

選擇性提交(Optional Commits)

在使用Docker守護(hù)程序進(jìn)行鏡像構(gòu)建期間,將為新生構(gòu)建或有更改內(nèi)容的每個(gè)構(gòu)建步驟生成diff層。這導(dǎo)致創(chuàng)建images鏡像非常臃腫。有時(shí),可以通過(guò)合理地使用構(gòu)建步驟在控制這些中間層,或?qū)⒋罅棵罱M合到一個(gè)Dockerfile指令中來(lái)控制這些中間層的數(shù)量。 Makisu使用自己獨(dú)特的技術(shù)來(lái)緩解此問(wèn)題。 Makisu的Dockerfile指令解析器引入了一個(gè)指令,該指令控制在構(gòu)建過(guò)程中何時(shí)提交差異層。語(yǔ)法#!COMMIT注釋的任何指令都被解析器解釋為生成新層。那些沒(méi)有該注釋的將不會(huì)生成新的層。

``` FROM alpine RUN apk add --no-cache wget RUN apk add --no-cache curl #!COMMIT ``` 在上面的示例中,安裝wget的RUN指令未提交為新層,而安裝curl的則被提交。它創(chuàng)建了一個(gè)圖層,其中包含自上一次提交以來(lái)或從構(gòu)建階段開始以來(lái)的所有新內(nèi)容。 當(dāng)為Makisu指定--commit = explicit標(biāo)志時(shí),顯示緩存將為構(gòu)建打開。

沒(méi)有它,#!COMMIT語(yǔ)法將被視為注釋,就像Docker守護(hù)程序的解析器一樣。這樣,用于Makisu顯式緩存的Dockerfile便與Docker守護(hù)程序保持兼容。 顯式提交可以為鏡像構(gòu)建提供更大的靈活性;創(chuàng)建的層數(shù)更少,通常會(huì)使得圖像更小,并改善了Dockerfile的可維護(hù)性。

結(jié)論

Makisu是一種非常強(qiáng)大的容器鏡像構(gòu)建工具,它是出于解決大型生產(chǎn)環(huán)境中存在的缺陷而產(chǎn)生的。它的方法消除了在容器構(gòu)建期間對(duì)提升特權(quán)的需求(盡管構(gòu)建是作為root用戶執(zhí)行的),并且它具有一種新穎的方法來(lái)構(gòu)建緩存實(shí)現(xiàn)。 它無(wú)法解決Dockerfile指令順序解析中固有的構(gòu)建效率低下的問(wèn)題。而且,構(gòu)建執(zhí)行并不總是能忠實(shí)地反映Docker鏡像構(gòu)建的預(yù)期行為。但是,Makisu來(lái)自的工程師團(tuán)隊(duì),是新型容器鏡像構(gòu)建工具的又一個(gè)重要補(bǔ)充。

網(wǎng)站名稱:利用Makisu構(gòu)建容器鏡像
當(dāng)前路徑:http://muchs.cn/article34/sdsgse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、云服務(wù)器、移動(dòng)網(wǎng)站建設(shè)、Google、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化