docker 导入镜像_官方下一代Docker镜像构建神器 -- BuildKit
BuildKit是Docker官方社區(qū)推出的下一代鏡像構(gòu)建神器--可以更加快速,有效,安全地構(gòu)建docker 鏡像。Docker v18.06已經(jīng)集成了該組件。BuildKit可用于多種導(dǎo)出格式(例如OCI或Docker)以及前端支持(Dockerfile),并提供高效緩存和運(yùn)行并行構(gòu)建操作等功能。BuildKit僅需要容器運(yùn)行時(shí)就能執(zhí)行,當(dāng)前受支持的運(yùn)行時(shí)包括containerd和runc。
構(gòu)建步驟優(yōu)化
Docker提供的原始構(gòu)建最令人沮喪的問題之一是Dockerfile指令執(zhí)行構(gòu)建步驟的順序性。在引入多階段構(gòu)建之后,可以將構(gòu)建步驟分組為單獨(dú)的邏輯構(gòu)建任務(wù)在同一個(gè)Dockerfile中。
有時(shí),這些構(gòu)建階段是彼此完全獨(dú)立的,這意味著它們可以并行執(zhí)行-或根本不需要執(zhí)行。遺憾的是,傳統(tǒng)的Docker鏡像構(gòu)建無法滿足這種靈活性。這意味著構(gòu)建時(shí)間通常會比絕對必要的時(shí)間更長。
相比之下,BuildKit會創(chuàng)建一個(gè)構(gòu)建步驟之間的依賴關(guān)系圖,并使用該圖來確定可以忽略構(gòu)建的哪些元素;可以并行執(zhí)行的元素;需要順序執(zhí)行的元素。這可以更有效地執(zhí)行構(gòu)建,這對開發(fā)人員來說很有價(jià)值,因?yàn)樗麄兛梢缘鋺?yīng)用程序的鏡像構(gòu)建。
高效靈活的緩存
雖然在舊版Docker鏡像構(gòu)建中緩存構(gòu)建步驟非常有用,但效率卻不如預(yù)期。作為對構(gòu)建后端的重寫,BuildKit在此方面進(jìn)行了改進(jìn),并提供了更快,更準(zhǔn)確的緩存機(jī)制。使用為構(gòu)建生成的依賴關(guān)系圖,并且基于指令定義和構(gòu)建步驟內(nèi)容。
BuildKit提供的另一個(gè)巨大好處是以構(gòu)建緩存導(dǎo)入和導(dǎo)出的形式出現(xiàn),正如Kaniko和Makisu允許將構(gòu)建緩存推送到遠(yuǎn)程注冊表一樣,BuildKit也是如此,但是BuildKit使您可以靈活地將緩存嵌入到內(nèi)部注冊表中。鏡像(內(nèi)聯(lián))并將它們放在一起(雖然不是每個(gè)注冊表都支持),或者將它們分開導(dǎo)入。也可以將緩存導(dǎo)出到本地目錄以供以后使用。
當(dāng)從頭開始建立構(gòu)建環(huán)境而沒有任何先前的構(gòu)建歷史時(shí),導(dǎo)入構(gòu)建緩存的能力就發(fā)揮了自己的作用:導(dǎo)入“預(yù)熱”緩存,對于臨時(shí)CI/CD環(huán)境特別有用。
工件
當(dāng)使用舊版Docker鏡像構(gòu)建器構(gòu)建鏡像時(shí),將生成的鏡像添加到Docker守護(hù)進(jìn)程管理的本地鏡像的緩存中。需要單獨(dú)的docker push將該鏡像上載到遠(yuǎn)程容器鏡像注冊表。新的工件構(gòu)建工具通過允許您在構(gòu)建調(diào)用時(shí)指定鏡像推送來增強(qiáng)體驗(yàn),BuildKit也不例外,它還允許以幾種不同格式輸出鏡像;本地目錄中的文件,本地tarball,一個(gè)本地OCI鏡像tarball,一個(gè)Docker鏡像tarball,一個(gè)存儲在本地緩存中的Docker鏡像以及一個(gè)推送到注冊表的Docker鏡像,有很多格式!
擴(kuò)展語法
對于docker構(gòu)建體驗(yàn)而言,經(jīng)常重復(fù)出現(xiàn)的眾多功能請求之一就是安全處理鏡像構(gòu)建過程中所需的機(jī)密信息。Moby項(xiàng)目抵制了這一要求很多年了,但是,借助BuildKit靈活的“前端”定義,為Buildkit提供了一個(gè)實(shí)驗(yàn)性前端,它擴(kuò)展了Dockerfile語法。擴(kuò)展后的語法為RUN Dockerfile指令提供了有用的補(bǔ)充,其中包括安全性功能。
RUN --mount=type=secret,id=top-secret-passwd my_command引用實(shí)驗(yàn)性前端的Dockerfile可以為RUN指令臨時(shí)掛載秘鑰。使用 --secret 標(biāo)志將秘鑰提供給構(gòu)建,用于docker build。使用ssh mount類型可以轉(zhuǎn)發(fā)SSH代理連接以實(shí)現(xiàn)安全SSH身份驗(yàn)證。
BuildKit使用場景
BuildKit還有許多其他功能,可以極大地改善構(gòu)建容器鏡像的技巧。如果它是適用于許多不同環(huán)境的通用工具,那么如何使用它呢?
根據(jù)您工作的環(huán)境,這個(gè)問題的答案是多種多樣的。讓我們來看看。
Docker
盡管目前BuildKit不是Docker的默認(rèn)構(gòu)建工具,但是完全可以考慮將其作為Docker(v18.09 +)的首選構(gòu)建工具。當(dāng)然目前在windows平臺是不支持的。
臨時(shí)方案是設(shè)置環(huán)境變量DOCKER_BUILDKIT=1。
如果是想永久生效的話,將"features":{"buildkit": true} 添加到docker守護(hù)進(jìn)程的配置文件中。
在此配置中,由于Docker守護(hù)程序中的當(dāng)前限制,Docker并未充分展現(xiàn)BuildKit的全部功能。因此,Docker客戶端CLI已擴(kuò)展為提供插件框架,該框架允許使用插件擴(kuò)展提供了可用的CLI功能。一個(gè)名為Buildx的實(shí)驗(yàn)性插件會繞過守護(hù)程序中的舊版構(gòu)建函數(shù),并使用BuildKit后端進(jìn)行所有構(gòu)建,它提供所有熟悉的鏡像構(gòu)建命令和功能,但通過一些特定于BuildKit的附加功能對其進(jìn)行了擴(kuò)充。
BuildKit以及Buildx的都支持多個(gè)構(gòu)建器實(shí)例,這是一項(xiàng)重要功能,這實(shí)際上意味著可以共享一個(gè)構(gòu)建器實(shí)例場以進(jìn)行構(gòu)建;也許是一個(gè)項(xiàng)目被分配了一組構(gòu)建器實(shí)例。
$ docker buildx ls NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS default * docker default default running linux/amd64, linux/386默認(rèn)情況下,Buildx插件以docker驅(qū)動(dòng)程序?yàn)槟繕?biāo),該驅(qū)動(dòng)程序使用Docker守護(hù)程序提供的BuildKit庫具有其固有的局限性。另一個(gè)驅(qū)動(dòng)程序是docker-container,它可以透明地在容器內(nèi)啟動(dòng)BuildKit以執(zhí)行構(gòu)建。 BuildKit中提供的功能CLI:這是否是理想的工作流程,完全取決于個(gè)人或公司的選擇。
Kubernetes
越來越多的組織將構(gòu)建放到Kubernetes當(dāng)中,通常將容器鏡像構(gòu)建作為CI/CD工作流的一部分出現(xiàn)在pod中。在Kubernetes中運(yùn)行BuildKit實(shí)例時(shí),有一個(gè)每種部署策略都有其優(yōu)缺點(diǎn),每種策略都適合不同的目的。
除了使用Docker CLI為BuildKit啟動(dòng)面向開發(fā)人員的構(gòu)建之外,構(gòu)建還可以通過多種CI/CD工具觸發(fā)。使用BuildKit進(jìn)行的容器鏡像構(gòu)建可以作為Tekton Pipeline Task執(zhí)行。
結(jié)論
本文主要講了BuildKit諸多特性和使用場景。
目前類似的工具不少,如Redhat的Buildah,Google的Kaniko或Docker的BuildKit。
不過BuildKit是官方提供,和docker本身結(jié)合比較好。
總結(jié)
以上是生活随笔為你收集整理的docker 导入镜像_官方下一代Docker镜像构建神器 -- BuildKit的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keras faster物体检测_URP
- 下一篇: 复制内存时检测到可能的io争用条件_这篇