Docker Buildx插件


Docker Buildx插件

Overview

Docker Buildx是一個CLI插件,它擴展了Docker命令,完全支持Moby BuildKit builder toolkit提供的功能。它提供了與docker build相同的用戶體驗,並提供了許多新功能,如創建作用域生成器實例和針對多個節點並發構建。             

安裝             

Docker Buildx包含在Docker 19.03中,並與以下Docker Desktop版本捆綁在一起。請注意,必須啟用“實驗特性”選項才能使用Docker Buildx。

  • Docker Desktop Enterprise version 2.1.0
  • Docker Desktop Edge version 2.0.4.0 or higher

還可以從Docker buildx存儲庫下載最新的buildx二進制文件。

Build with buildx

To start a new build, run the command docker buildx build .

$ docker buildx build .

[+] Building 8.4s (23/32)

 => ...

Buildx使用BuildKit引擎生成,並且不需要DOCKER_BuildKit=1環境變量來啟動生成。             

docker buildx build命令支持docker build可用的功能,包括docker 19.03中的新功能,如輸出配置、內聯構建緩存和指定目標平台。此外,Buildx還支持常規docker構建尚不可用的新功能,如構建清單列表、分布式緩存和將構建結果導出到OCI映像tarballs。             

可以在通過驅動程序概念公開的不同配置中運行Buildx。目前,Docker支持一個“Docker”驅動程序,該驅動程序使用綁定到Docker守護程序二進制文件中的BuildKit庫,以及一個“Docker容器”驅動程序,該驅動程序在Docker容器中自動啟動BuildKit。             

不同驅動程序使用Buildx的用戶體驗非常相似。但是,有一些特性目前不受“docker”驅動程序的支持,因為綁定到docker后台程序中的BuildKit庫使用不同的存儲組件。相反,默認情況下,使用“docker”驅動程序生成的所有圖像都會自動添加到“docker images”視圖中,而在使用其他驅動程序時,需要使用--output選擇輸出圖像的方法。             

使用生成器實例             

默認情況下,如果支持的話,Buildx使用“docker”驅動程序,提供的用戶體驗與本機docker構建非常相似。請注意,必須使用本地共享守護程序來構建應用程序。             

Buildx允許創建獨立構建器的新實例。可以使用它來為CI構建獲取一個作用域環境,該環境不會更改共享守護程序的狀態,或者用於隔離不同項目的生成。可以為一組遠程節點創建一個新實例,形成一個構建場,並在它們之間快速切換。             

可以使用docker buildx create命令創建新實例。這將基於當前的配置創建一個新的構建器實例,其中包含一個節點。             

要使用遠程節點,可以在創建新生成器時指定DOCKER_HOST或遠程上下文名稱。創建新實例后,可以使用inspect、stop和rm命令管理其生命周期。要列出所有可用的生成器,請使用ls。在創建一個新的構建器之后,還可以向它添加新的節點。             

要在不同的構建器之間切換,請使用docker buildx use<name>。運行此命令后,生成命令將自動使用此生成器。             

Docker 19.03還提供了一個新的Docker context命令,可以使用該命令為遠程Docker API端點提供名稱。Buildx與docker context集成,確保所有上下文自動獲得一個默認的builder實例。也可以在創建新的生成器實例或向其中添加節點時將上下文名稱設置為目標。             

構建多平台鏡像             

BuildKit被設計成可以很好地為多個平台進行構建,而不僅僅適用於調用構建的用戶不經常運行的體系結構和操作系統。             

調用構建時,可以設置--platform標志以指定生成輸出的目標平台(例如,linux/amd64、linux/arm64、darwin/amd64)。            

當當前builder實例由“docker container”驅動程序支持時,可以一起指定多個平台。在本例中,它構建一個清單列表,其中包含所有指定架構的映像。當在docker run或docker service中使用此映像時,docker會根據節點的平台選擇正確的映像。             

可以使用Buildx和Dockerfiles支持的三種不同策略構建多平台映像:             

在內核中使用QEMU仿真支持              

使用同一生成器實例在多個本機節點上構建             

使用Dockerfile中的stage交叉編譯到不同的架構             

如果節點已經支持QEMU,那么QEMU是最簡單的開始方法(例如。如果使用的是Docker Desktop)。它不需要更改Dockerfile,BuildKit會自動檢測可用的輔助架構。當BuildKit需要為不同的體系結構運行一個二進制文件時,它會通過binfmt_misc處理程序中注冊的二進制文件自動加載它。             

使用多個本機節點可以更好地支持QEMU無法處理的更復雜的情況,並且通常具有更好的性能。可以使用--append標志向構建器實例添加其他節點。

# assuming contexts node-amd64 and node-arm64 exist in "docker context ls"

$ docker buildx create --use --name mybuild node-amd64

mybuild

$ docker buildx create --append --name mybuild node-arm64

$ docker buildx build --platform linux/amd64,linux/arm64 .

最后,根據您的項目,使用的語言可能對交叉編譯有很好的支持。在這種情況下,Dockerfiles中的多階段構建可以有效地用於使用--platform指定的平台,使用構建節點的本機架構來構建二進制文件。BUILDPLATFORM和TARGETPLATFORM等構建參數列表在Dockerfile中自動提供,並可供作為構建的一部分運行的進程使用。

FROM --platform=$BUILDPLATFORM golang:alpine AS build

ARG TARGETPLATFORM

ARG BUILDPLATFORM

RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log

FROM alpine

COPY --from=build /log /log

高級生成選項             

Buildx還旨在為高級構建概念提供支持,這些概念不僅僅是調用單個構建命令。             

BuildKit高效地處理多個並發生成請求和重復數據消除工作。構建命令可以與通用命令運行器(例如make)結合使用。但是,這些工具通常按順序調用構建,因此不能充分利用BuildKit並行化的潛力,也不能為用戶組合BuildKit的輸出。對於這個用例,添加了一個名為docker buildx bake的命令。             

bake命令支持從合成文件構建圖像,類似於合成構建,但允許將所有服務作為單個請求的一部分同時構建。             

將buildx設置為默認生成器             

運行命令docker buildx install將docker buildx命令設置為docker buildx的通假名。這使得docker build能夠使用當前buildx builder。             

要刪除此通假名,請運行docker buildx uninstall。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM