遠端驅動程式

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

概述

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

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

引數型別預設值描述
key字串設定 TLS 客戶端金鑰。
cert字串指向要向 buildkitd 提供的 TLS 客戶端證書的絕對路徑。
cacert字串指向用於驗證的 TLS 證書頒發機構的絕對路徑。
servername字串端點主機名。請求中使用的 TLS 伺服器名稱。
default-load布林值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 生成證書。

    您可以使用此 bake 定義 作為起點。

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

    請注意,雖然可以在不使用 TLS 的情況下透過 TCP 公開 BuildKit,但不建議這樣做。這樣做允許在沒有憑據的情況下任意訪問 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 公開到 localhost。

  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

本指南介紹如何建立類似於 kubernetes 驅動程式的設定,方法是手動建立 BuildKit Deployment。雖然 kubernetes 驅動程式將在幕後完成此操作,但有時可能需要手動擴充套件 BuildKit。此外,當從 Kubernetes Pod 內部執行構建時,Buildx 構建器將需要在每個 Pod 中重新建立,或者在它們之間複製。

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

    按照指南,使用 create-certs.sh 為 BuildKit 守護程式和客戶端建立證書,並建立一個帶有連線到它們的服務的 BuildKit Pod 部署。

  2. 假設該服務名為 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 服務。要遠端訪問構建器,您可以設定和使用 Ingress,這不在本指南的範圍之內。

除錯 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