Удаленный драйвер

Удаленный драйвер Buildx позволяет создавать более сложные пользовательские рабочие нагрузки, позволяя подключаться к экземплярам BuildKit, управляемым извне. Это полезно для сценариев, в которых требуется ручное управление демоном BuildKit, или когда демон BuildKit открыт из другого источника.

Синопсис

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

В следующей таблице рассмотрены доступные опции, специфичные для драйвера, которые можно передать в --driver-opt :

Параметр

Тип

По умолчанию

Описание

key

Строка

Устанавливает клиентский ключ TLS.

cert

Строка

Абсолютный путь к сертификату клиента TLS для представления buildkitd .

cacert

Строка

Абсолютный путь к центру сертификации TLS, используемому для проверки.

servername

Строка

Имя хоста конечной точки.

Имя сервера TLS, используемое в запросах.

Пример: Удаленное использование BuildKit через сокеты Unix

В этом руководстве показано, как создать установку с демоном 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 .

Помните, что вам нужно использовать флаг --load, если вы хотите загружает результат сборки в демон Docker.

Пример: Удаленный BuildKit в контейнере Docker

Это руководство покажет вам, как создать настройку, подобную драйверу docker- container, вручную загрузив Docker-контейнер BuildKit и подключившись к нему с помощью удаленного драйвера Buildx. Эта процедура позволит вручную создать контейнер и получает к нему доступ через его открытый порт. (Вероятно, лучше использовать драйвер docker-container, который подключается к BuildKit через демон Docker, но это для примера).

  1. Создание сертификатов для BuildKit. Вы можете использовать скрипт create-certs.sh в качестве отправной точки. Учтите, что, хотя BuildKit можно предоставлять через TCP без использования 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 для 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://localhost:1234
    

    В качестве альтернативы используйте схему URL docker- container:// для подключения к контейнеру BuildKit без указания порта:

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

Пример: Удаленный BuildKit в Kubernetes

Это руководство покажет вам, как создать настройку, подобную драйверу kubernetes, вручную создав BuildKit Deployment . Хотя драйвер kubernetes будет делать это под капотом, иногда может быть желательно масштабировать BuildKit вручную. Кроме того, при выполнении сборок внутри Kubernetes pods, Buildx builder должен быть создан заново в каждом pods или скопирован между ними.

  1. Создаёт развертывание Kubernetes buildkitd в соответствии с инструкциями здесь. Следуя руководству, создаёт сертификаты для демона и клиента BuildKit, используя create-certs.sh, и создаёт развертывание модулей BuildKit со службой, которая к ним подключается.

  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, что выходит за рамки данного руководства.

Для удаленного доступа к сервису используйте механизм переадресации портов kubectl :

$ kubectl port-forward svc/buildkitd 1234:1234

Затем вы можете указывает удаленный драйвер на tcp://localhost:1234 .

В качестве альтернативы можно использовать схему URL kube-pod:// для прямого подключения к стручку BuildKit через API Kubernetes. Обратите внимание, что данный метод подключается только к одной капсуле в развертывании:

$ 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