遠端驅動程式
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。
確保已安裝 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 生成證書。
您可以使用此烘焙定義作為起點
SAN="localhost 127.0.0.1" docker buildx bake "https://github.com/moby/buildkit.git#master:examples/create-certs"
請注意,雖然可以透過 TCP 暴露 BuildKit 而不使用 TLS,但不建議這樣做。這樣做允許在沒有憑據的情況下任意訪問 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 暴露給本地主機。
使用 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 內部重新建立或在它們之間複製。
按照此處的說明,建立
buildkitd
的 Kubernetes 部署。按照指南,使用 create-certs.sh 為 BuildKit 守護程序和客戶端建立證書,並建立 BuildKit pod 的部署以及連線到它們的 Service。
假設 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
。