建置器

構建器 (Builder) 是您可以用來執行建置任務的 BuildKit 常駐程式。BuildKit 是負責解析 Dockerfile 中的構建步驟,以產生容器映像檔或其他人工製品的構建引擎。

您可以建立並管理構建器、檢查它們,甚至連線到遠端執行的構建器。您可以使用 Docker CLI 與構建器互動。

預設構建器

Docker Engine 會自動建立一個構建器,並將其作為您建置任務的預設後端。此構建器使用隨常駐程式綁定 (bundled) 的 BuildKit 函式庫,無需進行任何設定。

預設構建器直接與 Docker 常駐程式及其 context (內容環境) 綁定。如果您變更了 Docker context,您的 default 構建器將指向新的 Docker context。

建置驅動程式

Buildx 實作了構建驅動程式 (build drivers) 的概念,用於指向不同的構建器設定。由常駐程式建立的預設構建器使用 docker 驅動程式

Buildx 支援下列構建驅動程式:

  • docker:使用綁定在 Docker 常駐程式中的 BuildKit 函式庫。
  • docker-container:使用 Docker 建立一個專用的 BuildKit 容器。
  • kubernetes:在 Kubernetes 叢集中建立 BuildKit Pod。
  • remote:直接連線到手動管理的 BuildKit 常駐程式。

已選取的構建器

「已選取的構建器」是指執行建置指令時預設使用的構建器。

當您執行建置,或透過 CLI 與構建器互動時,可以使用選用的 --builder 旗標,或使用 BUILDX_BUILDER 環境變數來指定構建器的名稱。如果您未指定構建器,將會使用「已選取的構建器」。

使用 docker buildx ls 指令可查看可用的構建器實例。構建器名稱旁邊的星號 (*) 表示該構建器為已選取狀態。

$ docker buildx ls
NAME/NODE       DRIVER/ENDPOINT      STATUS   BUILDKIT PLATFORMS
default *       docker
  default       default              running  v0.11.6  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386
my_builder      docker-container
  my_builder0   default              running  v0.11.6  linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386

選擇不同的構建器

若要在構建器之間切換,請使用 docker buildx use <name> 指令。

執行此指令後,當您發起建置時,系統會自動選取您指定的構建器。

docker builddocker buildx build 的區別

儘管 docker builddocker buildx build 的別名,但這兩個指令之間存在細微差別。使用 Buildx 時,建置客戶端與常駐程式 (BuildKit) 是解耦的。這意味著您可以在單一客戶端上使用多個構建器,甚至是遠端的構建器。

為了確保與舊版 Docker CLI 的向後相容性,docker build 指令預設始終使用隨 Docker Engine 綁定的預設構建器。另一方面,docker buildx build 指令在將建置任務發送到 BuildKit 之前,會先檢查您是否設定了其他構建器作為預設構建器。

若要將 docker build 指令用於非預設構建器,您必須:

  • 透過 --builder 旗標或 BUILDX_BUILDER 環境變數明確指定構建器。

    $ BUILDX_BUILDER=my_builder docker build .
    $ docker build --builder my_builder .
    
  • 執行以下指令,將 Buildx 設定為預設客戶端:

    $ docker buildx install
    

    這會更新您的 Docker CLI 設定檔,確保所有與建置相關的指令皆透過 Buildx 進行路由。

    提示

    若要復原此變更,請執行 docker buildx uninstall

一般而言,當您想使用自訂構建器時,我們建議使用 docker buildx build 指令。這能確保您的 已選取構建器 設定被正確解讀。

補充資訊

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.