Как использовать команду docker buildx bake для сборки нескольких целей

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь эффективно использовать команду docker buildx bake для управления и сборки нескольких целей (targets) Docker-образов из одного конфигурационного файла. Мы начнём с создания файла docker-bake.hcl, который определяет различные цели сборки с разными конфигурациями.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/images -.-> lab-555044{{"Как использовать команду docker buildx bake для сборки нескольких целей"}} docker/build -.-> lab-555044{{"Как использовать команду docker buildx bake для сборки нескольких целей"}} end

Создание простого файла docker-bake.hcl с несколькими целями

На этом шаге мы создадим базовый файл docker-bake.hcl. Этот файл использует формат HCL (HashiCorp Configuration Language) и позволяет определять несколько целей сборки для ваших Docker-образов. Это особенно полезно, когда у вас разные конфигурации сборки или нужно собрать несколько связанных образов из одного источника.

Сначала перейдите в директорию ~/project, которая является рабочей для этой лабораторной работы.

cd ~/project

Теперь создадим новый файл docker-bake.hcl с помощью редактора nano.

nano docker-bake.hcl

В редакторе nano вставьте следующее содержимое. Этот файл определяет две цели сборки: my-app-dev и my-app-prod. Каждая цель указывает используемый Dockerfile (Dockerfile), контекст сборки (.) и теги для результирующего образа.

target "my-app-dev" {
  dockerfile = "Dockerfile"
  context = "."
  tags = ["my-app:dev"]
}

target "my-app-prod" {
  dockerfile = "Dockerfile"
  context = "."
  tags = ["my-app:prod"]
  args = {
    BUILD_ENV = "production"
  }
}

В этом файле:

  • target "my-app-dev" определяет цель с именем my-app-dev
  • dockerfile = "Dockerfile" указывает, что сборка должна использовать файл Dockerfile в контексте
  • context = "." устанавливает контекст сборки в текущую директорию
  • tags = ["my-app:dev"] присваивает образу тег my-app:dev
  • target "my-app-prod" определяет другую цель с именем my-app-prod
  • Также использует Dockerfile и текущую директорию как контекст
  • tags = ["my-app:prod"] присваивает образу тег my-app:prod
  • args = { BUILD_ENV = "production" } передает аргумент сборки BUILD_ENV со значением production в Dockerfile при сборке этой цели

Сохраните файл, нажав Ctrl + S, и выйдите из nano, нажав Ctrl + X.

Далее нам нужен простой Dockerfile, на который будет ссылаться наш bake-файл. Создайте файл Dockerfile в той же директории.

nano Dockerfile

Вставьте следующее содержимое в Dockerfile:

FROM alpine:latest

ARG BUILD_ENV=development

RUN echo "Building for environment: $BUILD_ENV"

CMD ["echo", "Hello from $BUILD_ENV environment!"]

Этот Dockerfile использует базовый образ alpine:latest. Он определяет аргумент сборки BUILD_ENV со значением по умолчанию development. Инструкция RUN выводит окружение сборки во время процесса сборки, а инструкция CMD устанавливает команду по умолчанию, которая выполняется при запуске контейнера из этого образа.

Сохраните Dockerfile и выйдите из nano.

Теперь вы успешно создали файл docker-bake.hcl с двумя целями и простой Dockerfile для работы с ним.

Сборка конкретной цели с помощью docker buildx bake

На предыдущем шаге мы создали файл docker-bake.hcl с двумя целями сборки: my-app-dev и my-app-prod. Теперь мы используем команду docker buildx bake для сборки конкретной цели, определённой в этом файле.

Команда docker buildx bake позволяет собирать образы на основе конфигураций, определённых в bake-файле. Указав имя цели после команды, вы даёте указание Buildx собрать только эту конкретную цель.

Давайте соберём цель my-app-dev. Убедитесь, что находитесь в директории ~/project.

cd ~/project

Теперь выполните следующую команду:

docker buildx bake my-app-dev

Эта команда прочитает файл docker-bake.hcl в текущей директории и соберёт цель с именем my-app-dev. Вы увидите вывод, показывающий процесс сборки, включая шаги, определённые в Dockerfile.

[+] Building 0.0s (0/0)
... (вывод сборки) ...

После завершения сборки вы можете проверить, что образ my-app:dev был создан, выведя список локальных Docker-образов.

docker images

В списке образов вы должны увидеть my-app с тегом dev.

Теперь соберём цель my-app-prod. Эта цель включает аргумент сборки BUILD_ENV, установленный в значение production.

docker buildx bake my-app-prod

Наблюдайте за выводом. Во время сборки вы должны увидеть строку Building for environment: production, что подтверждает правильную передачу аргумента сборки.

[+] Building 0.0s (0/0)
... (вывод сборки с "Building for environment: production") ...

После завершения этой сборки снова выведите список образов.

docker images

Теперь в списке образов вы должны увидеть как my-app:dev, так и my-app:prod.

Используя docker buildx bake с указанием имени цели, вы можете выборочно собирать различные конфигурации, определённые в вашем bake-файле.

Просмотр доступных целей в bake-файле

На предыдущих шагах мы создали файл docker-bake.hcl и собирали из него конкретные цели. Иногда может потребоваться просмотреть все доступные цели, определённые в bake-файле, без их фактической сборки. Команда docker buildx bake предоставляет такую возможность.

Для вывода списка доступных целей можно просто выполнить команду docker buildx bake без указания имён целей. По умолчанию она прочитает файл docker-bake.hcl в текущей директории и отобразит имена всех определённых целей.

Убедитесь, что находитесь в директории ~/project, где расположен ваш файл docker-bake.hcl.

cd ~/project

Теперь выполните следующую команду:

docker buildx bake

Вы должны увидеть вывод, похожий на этот, с перечислением целей из вашего файла docker-bake.hcl:

my-app-dev
my-app-prod

Этот вывод показывает имена двух целей, которые мы определили в файле docker-bake.hcl: my-app-dev и my-app-prod. Это быстрый способ получить обзор доступных конфигураций сборки в bake-файле.

Данная команда полезна для понимания структуры bake-файла и идентификации целей, которые можно собрать.

Переопределение конфигурации цели с помощью флага --set

В этом шаге мы научимся переопределять конфигурацию конкретной цели, определённой в файле docker-bake.hcl, используя флаг --set с командой docker buildx bake. Это полезно, когда требуется внести небольшие изменения в конфигурацию цели без редактирования самого bake-файла.

Флаг --set позволяет переопределять конкретные атрибуты цели. Синтаксис: имя_цели.атрибут=значение.

Допустим, мы хотим собрать цель my-app-dev, но с другим тегом, например, my-app:staging. Мы можем сделать это с помощью флага --set.

Убедитесь, что находитесь в директории ~/project.

cd ~/project

Теперь выполните следующую команду:

docker buildx bake my-app-dev --set my-app-dev.tags=my-app:staging

В этой команде:

  • my-app-dev — имя собираемой цели
  • --set my-app-dev.tags=my-app:staging переопределяет атрибут tags цели my-app-dev, устанавливая значение my-app:staging

Вы увидите вывод процесса сборки.

[+] Building 0.0s (0/0)
... (вывод сборки) ...

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

docker images

Теперь в списке вы должны увидеть my-app с тегом staging, в дополнение к тегам dev и prod из предыдущих шагов.

Также можно переопределять другие атрибуты, например, аргументы сборки. Давайте соберём цель my-app-prod, но переопределим аргумент BUILD_ENV на qa.

docker buildx bake my-app-prod --set my-app-prod.args.BUILD_ENV=qa

Наблюдайте за выводом сборки. Вы должны увидеть Building for environment: qa, что подтверждает успешное переопределение аргумента сборки.

[+] Building 0.0s (0/0)
... (вывод сборки с "Building for environment: qa") ...

Флаг --set предоставляет гибкий способ кастомизации сборок прямо из командной строки без изменения bake-файла.

Вывод итоговой конфигурации без сборки

В этом завершающем шаге мы рассмотрим, как просмотреть окончательную конфигурацию, которую docker buildx bake будет использовать для конкретной цели, включая все переопределения, применённые с помощью флага --set, без фактического запуска сборки. Это полезно для отладки bake-файлов и понимания итоговой конфигурации перед сборкой.

Флаг --print в команде docker buildx bake позволяет вывести разрешённую конфигурацию в формате JSON.

Убедитесь, что находитесь в директории ~/project.

cd ~/project

Выведем конфигурацию для цели my-app-dev.

docker buildx bake my-app-dev --print

Эта команда выведет JSON-представление конфигурации цели my-app-dev, полученной из файла docker-bake.hcl.

{
  "target": {
    "my-app-dev": {
      "dockerfile": "Dockerfile",
      "context": ".",
      "tags": ["my-app:dev"]
    }
  }
}

Теперь посмотрим, как флаг --set влияет на выводимую конфигурацию. Выведем конфигурацию для my-app-dev, переопределив тег на my-app:testing.

docker buildx bake my-app-dev --set my-app-dev.tags=my-app:testing --print

Обратите внимание на вывод. Атрибут tags в JSON-выводе теперь должен отражать переопределённое значение.

{
  "target": {
    "my-app-dev": {
      "dockerfile": "Dockerfile",
      "context": ".",
      "tags": ["my-app:testing"]
    }
  }
}

Аналогично можно вывести конфигурацию для цели my-app-prod и переопределить её аргумент сборки.

docker buildx bake my-app-prod --set my-app-prod.args.BUILD_ENV=staging --print

JSON-вывод для цели my-app-prod покажет args с переопределённым значением BUILD_ENV.

{
  "target": {
    "my-app-prod": {
      "dockerfile": "Dockerfile",
      "context": ".",
      "tags": ["my-app:prod"],
      "args": {
        "BUILD_ENV": "staging"
      }
    }
  }
}

Флаг --print является ценным инструментом для проверки конфигураций bake-файлов и понимания того, как применяются переопределения перед запуском потенциально длительных процессов сборки.

Итоги

В этой лабораторной работе мы изучили, как использовать команду docker buildx bake для управления и сборки нескольких целей Docker-образов, определённых в одном файле docker-bake.hcl. Мы начали с создания базового файла docker-bake.hcl с различными целями, каждая из которых указывает свой Dockerfile, контекст, теги и аргументы сборки.

Затем мы рассмотрели:

  • Сборку конкретной цели из bake-файла с помощью docker buildx bake <имя_цели>
  • Вывод списка всех доступных целей в файле
  • Динамическое переопределение конфигураций целей с использованием флага --set
  • Предварительный просмотр итоговой конфигурации сборки без фактического выполнения сборки с помощью флага --print

Эти шаги демонстрируют гибкость и мощь docker buildx bake для оптимизации сложных рабочих процессов сборки нескольких образов.