Поиск по сайту:

Что такое Docker BuildKit и почему это важно?


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

Что такое Билдкит?

BuildKit был разработан в рамках проекта Moby, попытки Docker «собрать специализированные системы контейнеров, не изобретая велосипед». О нем было объявлено в 2017 году, и он начал поставляться с Docker Engine в версии 18.09 2018 года.

BuildKit ориентирован на повышение производительности сборки, управление хранилищем и расширяемость. Его заголовки претендуют на параллельную обработку, более продвинутое кэширование, подключаемую архитектуру и автоматическую сборку мусора. Они объединяются в систему сборки, которая более эффективна и расширяема, чем исходный движок.

Слои, которые не влияют друг на друга, можно создавать одновременно, что сокращает время ожидания завершения этапов. BuildKit также оптимизирует доступ к локальным файлам, на которые вы ссылаетесь, с помощью инструкций COPY. Он отслеживает вносимые вами изменения и копирует только те файлы, которые были изменены с момента последней сборки, вместо передачи всего контекста сборки.

BuildKit также упрощает многоплатформенные сборки. Вы можете указать флаг --platform, чтобы указать цели для сборки. BuildKit автоматически соберет соответствующий манифест образа для всех указанных архитектур.

docker buildx --create --platform linux/amd64,linux/arm64 .

Как работает BuildKit?

Повышению производительности BuildKit способствует использование низкоуровневого формата определения сборки, получившего название LLB. Это двоичный формат на основе графа, который связывает сложные определения сборки.

Поскольку слои связаны напрямую, BuildKit упрощает сравнение графиков сборки и содержимого, которое они включают. Создатель Dockerfile по умолчанию должен полагаться на неточную эвристику, чтобы определить, сопоставимы ли два образа.

LLB полностью отделен от внешнего интерфейса BuildKit. Внешний интерфейс берет удобочитаемое представление изображения, такое как Dockerfile, и преобразует его в граф LLB. После создания LLB его можно экспортировать и перемещать между средами. Экспорт в реестр позволяет внешним клиентам получить существующую LLB для дальнейшего повышения производительности при первой сборке.

Технические детали LLB довольно сложны. Базовая технология основана на теории графов и сравнении контрольных сумм. Вам не нужно понимать его, чтобы воспользоваться его мощью: как конечный пользователь, сборка работает так же, как и раньше, с помощью команды docker build.

BuildKit по-прежнему создает образы, совместимые с OCI, которые переносимы в различные среды контейнеров. Вы можете использовать BuildKit для создания любого образа Docker на базе Linux. Образы Windows в настоящее время не поддерживаются.

Активация поддержки BuildKit

Есть два способа включить BuildKit. Если вы хотите создать один образ с этой функцией, установите переменную среды DOCKER_BUILDKIT в своей оболочке:

DOCKER_BUILDKIT=1 docker build .

Для долгосрочного использования настройте демон Docker на использование BuildKit по умолчанию. Создайте или отредактируйте файл /etc/docker/daemon.json и добавьте следующее содержимое в объект конфигурации верхнего уровня:

{
    "features": {
        "buildkit": true
    }
}

Перезагрузите конфигурацию демона, чтобы применить изменения:

systemctl reload docker

BuildKit теперь будет использоваться вместо механизма сборки по умолчанию при выполнении команды docker build.

Вы можете сказать, когда BuildKit активен, потому что он производит другой вывод CLI по сравнению с обычным движком. Отображение прогресса BuildKit обеспечивает улучшенную читаемость и четкую визуализацию начала и завершения каждого этапа. Информация включает в себя разбивку времени, затраченного на создание каждого слоя.

«докер buildx»

Вы также можете взаимодействовать с BuildKit с помощью команд docker buildx. Они всегда будут использовать BuildKit. Группа команд dockerx предоставляет расширенные функции BuildKit, включая возможность сборки на удаленном хосте.

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

Вот пример добавления удаленного хоста в качестве цели BuildKit. Это предполагает, что на целевой машине есть сокет Docker, открытый через TCP-порт 2375. Вы можете сослаться на хост, используя любой идентификатор конечной точки Docker или имя контекста Docker (полученное из docker context ls). Последний позволяет создавать совместимые облачные среды, добавляя их в качестве контекста.

docker buildx create --name remote-builder tcp://my-docker-host:2375

Вы можете выбрать сборщик для использования с помощью команды docker buildx use:

docker buildx use remote-builder

Затем вы можете использовать команду build для сборки вашего образа на выбранном экземпляре компоновщика:

docker buildx build .

Вы можете удалить экземпляры сборщика с помощью docker buildx rm, передав имя сборщика. Сборщики перечислены с использованием docker buildx ls; вы можете использовать docker buildx inspect, чтобы получить более подробную информацию о конкретном сборщике.

Если вы хотите проверить использование диска BuildKit, выполните команду docker buildx du. Вы можете очистить кеш сборки, чтобы освободить хранилище, с помощью docker buildx prune. Это может снизить производительность при следующем восстановлении изображения, поскольку ранее кэшированные слои будут восстановлены.

Особенности сборки

BuildKit добавляет несколько дополнительных функций во время сборки, упрощающих действия с Dockerfile.

Вы можете передать секретные данные, используя флаг --secret. Это позволяет вашему Dockerfile получать доступ к конфиденциальным значениям, не сохраняя их внутри образа. Значение только доступно во время сборки.

docker build --secret id=demo-secret,src=demo-secret.txt .
FROM my-image:latest
RUN --mount=type=secret,id=demo-secret cat /run/secrets/demo-secrets

Этот Dockerfile ссылается на секрет под названием demo-secret. Его значение считывается из файла demo-secret.txt при запуске docker build. Инструкция RUN с флагом --mount обеспечивает доступ к секрету. Файл временно монтируется в каталог /run/secrets.

BuildKit также позволяет вам перенаправить SSH-агент вашего хоста, чтобы ваши инструкции по сборке могли взаимодействовать с существующими удаленными подключениями. Передайте флаг --ssh в docker build и добавьте --mount=type=ssh в инструкции RUN в ваш Dockerfile:

docker build --ssh .
RUN --mount=type=ssh git clone git@example.com:/project.git

Эти функции делают создание образов более удобным, не влияя на общую безопасность. Переадресация агента SSH и секретное монтирование доступны только в BuildKit; в механизме сборки по умолчанию нет аналога.

Заключение

BuildKit — это сборщик образов Docker следующего поколения, который использует графический двоичный формат для значительного ускорения сборки. Хотя производительность будет значительно различаться для каждого Dockerfile, вы можете ожидать значительного ускорения в тех случаях, когда возможна параллельная обработка слоев изображения.

Архитектура BuildKit оптимизирует некоторые из новейших функций Dockerfile. Многоэтапные сборки выигрывают от пропуска неиспользуемых этапов, что делает процесс более эффективным, чем стандартный сборщик.

Хотя BuildKit теперь стабилен, Docker по-прежнему не поставляется с ним по умолчанию. Обязательно включите его в своем клиенте Docker, если хотите использовать его функции. Есть активное предложение сделать BuildKit стандартным механизмом сборки, но все еще есть нерешенные проблемы, препятствующие переходу.




Все права защищены. © Linux-Console.net • 2019-2024