远程驱动程序
Buildx 远程驱动程序允许更复杂的自定义构建工作负载, 允许您连接到由外部管理的 BuildKit 实例。这在需要手动管理 BuildKit 守护程序, 或从其他来源公开 BuildKit 守护程序的场景中很有用。
概述
$ docker buildx create \
--name remote \
--driver remote \
tcp://localhost:1234
以下表格描述了可用于传递给 --driver-opt 的可用驱动程序特定选项:
| 参数 | 类型 | 默认 | 描述 |
|---|---|---|---|
key | string | 设置TLS客户端密钥。 | |
cert | string | 呈现给 buildkitd 的 TLS 客户端证书的绝对路径。 | |
cacert | string | 用于验证的TLS证书颁发机构的绝对路径。 | |
servername | string | 端点主机名。 | 在请求中使用的TLS服务器名称。 |
default-load | 布尔值 | false | 自动将镜像加载到 Docker 引擎镜像存储中。 |
示例:通过 Unix 套接字的远程 BuildKit
本指南向您展示如何创建一个设置,其中 BuildKit 守护程序在 Unix 套接字上监听,而 Buildx 通过该套接字进行连接。
确保已安装 BuildKit。
例如,您可以启动一个 buildkitd 实例:
$ sudo ./buildkitd --group $(id -gn) --addr unix://$HOME/buildkitd.sock或者, 参见此处 以在无root权限模式下运行 buildkitd,或 此处 查看将其作为systemd服务运行的示例。
检查您是否有一个可以连接的 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
本指南将向您展示如何通过手动启动 BuildKit Docker 容器并使用 Buildx 远程驱动程序连接到它,来创建类似于 docker-container
驱动程序的设置。此过程将手动创建容器并通过其暴露的端口访问它。(您可能最好使用通过 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 暴露到本地主机。
使用 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://localhost: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 容器中执行构建时,需要在每个容器内重新创建 Buildx 构建器,或在它们之间进行复制。
创建一个Kubernetes部署,数量为
buildkitd,按照以下说明操作 此处。按照指南,为 BuildKit 守护程序和客户端创建证书, 使用 create-certs.sh, 并创建一个 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://localhost:1234。