遠端驅動程式

Buildx 遠端驅動允許更復雜的自定義構建工作負載,使您能夠連線到外部管理的 BuildKit 例項。這對於需要手動管理 BuildKit 守護程序或從其他源暴露 BuildKit 守護程序的場景非常有用。

概要

$ docker buildx create \
  --name remote \
  --driver remote \
  tcp://:1234

下表描述了可以傳遞給 --driver-opt 的可用驅動程式特定選項

引數型別預設值描述
金鑰字串設定 TLS 客戶端金鑰。
證書字串要提供給 buildkitd 的 TLS 客戶端證書的絕對路徑。
CA 證書字串用於驗證的 TLS 證書頒發機構的絕對路徑。
伺服器名稱字串端點主機名。請求中使用的 TLS 伺服器名稱。
預設載入布林值false自動將映象載入到 Docker Engine 映象儲存。

示例:透過 Unix 套接字遠端 BuildKit

本指南將向您展示如何設定一個 BuildKit 守護程序,使其偵聽 Unix 套接字,並透過它連線 Buildx。

  1. 確保已安裝 BuildKit

    例如,您可以使用以下命令啟動一個 buildkitd 例項

    $ sudo ./buildkitd --group $(id -gn) --addr unix://$HOME/buildkitd.sock
    

    或者,請參見此處瞭解如何在無根模式下執行 buildkitd,或此處瞭解將其作為 systemd 服務執行的示例。

  2. 檢查您是否有一個可以連線的 Unix 套接字。

    $ ls -lh /home/user/buildkitd.sock
    srw-rw---- 1 root user 0 May  5 11:04 /home/user/buildkitd.sock
    
  3. 使用遠端驅動連線 Buildx

    $ docker buildx create \
      --name remote-unix \
      --driver remote \
      unix://$HOME/buildkitd.sock
    
  4. 使用 docker buildx ls 列出可用的構建器。您應該在其中看到 remote-unix

    $ docker buildx ls
    NAME/NODE           DRIVER/ENDPOINT                        STATUS  PLATFORMS
    remote-unix         remote
      remote-unix0      unix:///home/.../buildkitd.sock        running linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386
    default *           docker
      default           default                                running linux/amd64, linux/386
    

您可以使用 docker buildx use remote-unix 將此新構建器切換為預設構建器,或使用 --builder 為每個構建指定它

$ docker buildx build --builder=remote-unix -t test --load .

請記住,如果您想將構建結果載入到 Docker 守護程序中,則需要使用 --load 標誌。

示例:在 Docker 容器中遠端 BuildKit

本指南將向您展示如何建立一個類似於 docker-container 驅動的設定,透過手動啟動 BuildKit Docker 容器並使用 Buildx 遠端驅動連線到它。此過程將手動建立一個容器並透過其暴露的埠訪問它。(您最好直接使用透過 Docker 守護程序連線到 BuildKit 的 docker-container 驅動,但這僅用於說明目的。)

  1. 為 BuildKit 生成證書。

    您可以使用此烘焙定義作為起點

    SAN="localhost 127.0.0.1" docker buildx bake "https://github.com/moby/buildkit.git#master:examples/create-certs"
    

    請注意,雖然可以透過 TCP 暴露 BuildKit 而不使用 TLS,但不建議這樣做。這樣做允許在沒有憑據的情況下任意訪問 BuildKit。

  2. .certs/ 中生成證書後,啟動容器

    $ docker run -d --rm \
      --name=remote-buildkitd \
      --privileged \
      -p 1234:1234 \
      -v $PWD/.certs:/etc/buildkit/certs \
      moby/buildkit:latest \
      --addr tcp://0.0.0.0:1234 \
      --tlscacert /etc/buildkit/certs/daemon/ca.pem \
      --tlscert /etc/buildkit/certs/daemon/cert.pem \
      --tlskey /etc/buildkit/certs/daemon/key.pem
    

    此命令啟動一個 BuildKit 容器,並將守護程序的埠 1234 暴露給本地主機。

  3. 使用 Buildx 連線到此正在執行的容器

    $ docker buildx create \
      --name remote-container \
      --driver remote \
      --driver-opt cacert=${PWD}/.certs/client/ca.pem,cert=${PWD}/.certs/client/cert.pem,key=${PWD}/.certs/client/key.pem,servername=<TLS_SERVER_NAME> \
      tcp://:1234
    

    或者,使用 docker-container:// URL 方案連線到 BuildKit 容器,而無需指定埠

    $ docker buildx create \
      --name remote-container \
      --driver remote \
      docker-container://remote-container
    

示例:在 Kubernetes 中遠端 BuildKit

本指南將向您展示如何透過手動建立 BuildKit Deployment 來建立一個類似於 kubernetes 驅動的設定。雖然 kubernetes 驅動將在底層完成此操作,但有時可能希望手動擴充套件 BuildKit。此外,當從 Kubernetes pod 內部執行構建時,Buildx 構建器將需要從每個 pod 內部重新建立或在它們之間複製。

  1. 按照此處的說明,建立 buildkitd 的 Kubernetes 部署。

    按照指南,使用 create-certs.sh 為 BuildKit 守護程序和客戶端建立證書,並建立 BuildKit pod 的部署以及連線到它們的 Service。

  2. 假設 Service 名為 buildkitd,在 Buildx 中建立一個遠端構建器,確保列出的證書檔案存在

    $ docker buildx create \
      --name remote-kubernetes \
      --driver remote \
      --driver-opt cacert=${PWD}/.certs/client/ca.pem,cert=${PWD}/.certs/client/cert.pem,key=${PWD}/.certs/client/key.pem \
      tcp://buildkitd.default.svc:1234
    

請注意,這僅在叢集內部有效,因為 BuildKit 設定指南只建立了一個 ClusterIP 服務。要遠端訪問構建器,您可以設定並使用入口,這超出了本指南的範圍。

除錯 Kubernetes 中的遠端構建器

如果您在訪問部署在 Kubernetes 中的遠端構建器時遇到問題,您可以使用 kube-pod:// URL 方案透過 Kubernetes API 直接連線到 BuildKit pod。請注意,此方法僅連線到部署中的單個 pod。

$ kubectl get pods --selector=app=buildkitd -o json | jq -r '.items[].metadata.name'
buildkitd-XXXXXXXXXX-xxxxx
$ docker buildx create \
  --name remote-container \
  --driver remote \
  kube-pod://buildkitd-XXXXXXXXXX-xxxxx

或者,使用 kubectl 的埠轉發機制

$ kubectl port-forward svc/buildkitd 1234:1234

然後您可以將遠端驅動指向 tcp://:1234