遠端驅動程式
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 透過該套接字進行連線。
確保已安裝 BuildKit。
例如,您可以啟動 buildkitd 的例項,方法是
$ sudo ./buildkitd --group $(id -gn) --addr unix://$HOME/buildkitd.sock
檢查您是否有一個可以連線的 Unix 套接字。
$ ls -lh /home/user/buildkitd.sock srw-rw---- 1 root user 0 May 5 11:04 /home/user/buildkitd.sock
使用遠端驅動程式將 Buildx 連線到它
$ docker buildx create \ --name remote-unix \ --driver remote \ unix://$HOME/buildkitd.sock
使用
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
驅動程式,但這僅僅是為了說明目的。)
為 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。
在
.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。
使用 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 中重新建立,或者在它們之間複製。
建立
buildkitd
的 Kubernetes 部署,按照 此處 的說明。按照指南,使用 create-certs.sh 為 BuildKit 守護程式和客戶端建立證書,並建立一個帶有連線到它們的服務的 BuildKit Pod 部署。
假設該服務名為
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
。