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