BuildKit

Обзор

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

  • Обнаружение и пропуск выполнения неиспользуемых этапов сборки

  • Распараллеливание создания независимых этапов сборки

  • Инкрементально переносит только измененные файлы в build context между сборками

  • Обнаружение и пропуск передачи неиспользуемых файлов в build context

  • Использование реализаций Внешний интерфейс dockerfile с множеством новых возможностей

  • Избегать побочных эффектов с остальной частью API (промежуточные образы и контейнеры)

  • Определяет приоритеты кэша сборки для автоматической обрезки

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

LLB

В основе BuildKit лежит формат определения Low-Level Build (LLB). LLB — это промежуточный двоичный формат, который позволяет разработчикам расширять BuildKit. LLB определяет граф зависимостей с адресацией по содержимому, который можно использовать для составления очень сложных определений сборки. Он также поддерживает функции, не представленные в Dockerfiles, такие как прямое монтирование данных и вложенный вызов.

Directed acyclic graph (DAG)

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

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

Frontend

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

Например, чтобы построить Dockerfile с помощью BuildKit, нужно использовать внешний фронтенд Dockerfile.

Начало работы

BuildKit включён по умолчанию для всех пользователей на Рабочий стол Docker. Если вы установили Docker Desktop, вам не нужно вручную включать BuildKit. Если вы используете Docker в Linux, вы можете включить BuildKit либо с помощью переменной окружения, либо сделав BuildKit настройкой по умолчанию.

Чтобы установить переменную окружения BuildKit при выполнении команды docker build, выполняет команду:

$ DOCKER_BUILDKIT=1 docker build .

Примечание

Buildx всегда включает BuildKit.

Чтобы включить docker BuildKit по умолчанию, устанавливает конфигурацию демона в функции /etc/docker/daemon.json на true и перезапустите демон. Если файл daemon.json не существует, создаёт новый файл с именем daemon.json, а затем добавляет в него следующее.

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

И перезапустите демон Docker.

Предупреждение

BuildKit поддерживает только создание контейнеров Linux. Поддержка Windows отслеживается в moby/buildkit#616