Buildah: Пошаговая инструкция и практические примеры для создания OCI-образов

Подробное практическое руководство по использованию Buildah для создания контейнерных образов. Статья включает пошаговые инструкции от установки до продвинутых сценариев сборки, сравнение с Dockerfile и примеры интеграции в CI/CD.
В мире контейнеризации Docker долгое время был синонимом процесса сборки образов. Однако новые инструменты, такие как Buildah, предлагают более гибкий, безопасный и не требующим демона подход к созданию OCI- и Docker-совместимых контейнерных образов. Buildah позволяет собирать образы из Dockerfile, но также предоставляет низкоуровневый API для точного контроля над каждым слоем. Это делает его идеальным выбором для CI/CD пайплайнов, сред с повышенными требованиями безопасности и для тех, кто хочет глубоко понять механику контейнерных образов. Давайте разберем его особенности на практике.

Установка Buildah достаточно проста. На большинстве Linux-дистрибутивов он доступен из официальных репозиториев (например, `apt-get install buildah` на Ubuntu/Debian или `yum install buildah` на RHEL/CentOS). После установки вы можете сразу начать работу, так как Buildah не требует постоянно работающего демона. Ваш первый шаг — проверить наличие базовых образов с помощью `buildah images` или загрузить новый, например, `buildah from ubuntu:22.04`. Эта команда создаст "контейнер" (рабочую среду) на основе указанного образа.

Основная сила Buildah раскрывается при использовании его командной строки, которая напоминает Docker, но с важными отличиями. Рассмотрим пошаговую сборку простого образа с веб-сервером Nginx без использования Dockerfile. Сначала создаем контейнер из базового образа: `container=$(buildah from ubuntu:22.04)`. Переменная `$container` теперь хранит ID рабочего контейнера. Далее мы можем выполнять команды внутри этого контейнера, используя `buildah run $container -- apt-get update && apt-get install -y nginx`. Buildah смонтирует корневую файловую систему контейнера и выполнит команду, установив пакеты.

После установки необходимого ПО мы можем копировать файлы из хост-системы в контейнер: `buildah copy $container ./index.html /var/www/html/`. Это аналог инструкции `COPY` в Dockerfile. Для настройки конфигурации или установки переменных окружения используйте `buildah config`. Например, чтобы указать команду запуска: `buildah config --cmd ["nginx", "-g", "daemon off;"] $container`. Также можно задать рабочую директорию, точку входа, метаданные (лейблы) и порты.

Когда контейнер настроен, пришло время создать из него образ. Выполните `buildah commit $container my-nginx-image:latest`. Эта команда создаст новый OCI-образ с именем `my-nginx-image` и тегом `latest` на основе изменений в рабочем контейнере. Вы можете проверить список образов командой `buildah images`. Для отправки образа в реестр (например, Docker Hub) используйте `buildah push my-nginx-image:latest docker://docker.io/yourusername/my-nginx:latest`.

Однако Buildah также полностью поддерживает сборку из Dockerfile, что удобно для миграции существующих проектов. Команда `buildah bud -t my-app:latest .` (где `bud` означает "build using Dockerfile") выполнит сборку из Dockerfile в текущей директории. При этом Buildah может использовать кэш слоев для ускорения последующих сборок. Ключевое преимущество здесь — отсутствие необходимости в демоне Docker. Это повышает безопасность, так как процесс сборки запускается с привилегиями обычного пользователя, и позволяет запускать сборку в изолированных средах, где установка Docker нежелательна.

Практический пример для CI/CD: сборка минималистичного образа приложения на Go. Вместо многоступенчатого Dockerfile можно использовать Buildah для более контролируемого процесса. Сначала создаем контейнер из `golang:alpine`, копируем исходный код, запускаем `go build` для создания статического бинарника. Затем создаем *новый* контейнер из `scratch` (пустой образ) или `alpine` и копируем в него только готовый бинарник из первого контейнера. Это делается с помощью `buildah copy --from=$first_container $second_container /go/bin/app /app`. В результате финальный образ содержит только бинарник и необходимые библиотеки, без компилятора и исходного кода, что соответствует лучшим практикам безопасности.

Еще одна мощная особенность Buildah — возможность манипулировать образами на низком уровне. Вы можете монтировать образ для проверки его содержимого: `mountpoint=$(buildah mount $container) && cd $mountpoint`. Это позволяет вносить точечные изменения или извлекать файлы без необходимости запуска контейнера. После завершения работы не забудьте размонтировать: `buildah unmount $container`.

Интеграция с Podman, другим инструментом от Red Hat для управления контейнерами, является бесшовной. Образы, созданные Buildah, автоматически доступны Podman (`podman images`), и вы можете запускать из них контейнеры с помощью `podman run`. Эта связка (Buildah для сборки, Podman для запуска и управления) формирует мощную, безопасную альтернативу классическому Docker Engine, особенно в корпоративных и Kubernetes-окружениях.

Для автоматизации в скриптах Bash или Python Buildah предоставляет стабильный CLI и API на Go. Вы можете легко встроить его в свои пайплайны сборки. Например, в Jenkins или GitLab CI вы можете запустить задание на агенте, где установлен только Buildah, без полного Docker, что уменьшает поверхность для атаки и потребление ресурсов.

Освоение Buildah требует смены парадигмы: вы начинаете думать об образе не как о результате выполнения скрипта (Dockerfile), а как о наборе дискретных, контролируемых шагов. Это дает беспрецедентную гибкость, особенно для сложных сценариев сборки, где логика зависит от внешних факторов. Начиная с простых сценариев и постепенно переходя к сложным, вы сможете создавать более эффективные, безопасные и воспроизводимые контейнерные образы.
286 1

Комментарии (13)

avatar
vrwz71 27.03.2026
Встречал мнение, что для простых задач Docker проще. Согласны?
avatar
ahv4wmma 27.03.2026
Buildah спас, когда нужно было собирать образы из rootless-контейнеров. Docker не позволял.
avatar
nnrgacmall 27.03.2026
Хорошо расписаны основы. Жду продолжения про интеграцию с Kubernetes.
avatar
yjk2xjqto 28.03.2026
Спасибо за практические примеры. Как раз искал альтернативу для безопасных сред.
avatar
m25i8sqcqyy2 29.03.2026
Podman + Buildah — отличная комбинация для бесдемонной контейнеризации. Рекомендую.
avatar
i2dnynu3ds 29.03.2026
Для безопасности — топ. Не нужно запускать демон от root для сборки образов.
avatar
kae0o9 29.03.2026
А есть ли сравнение скорости сборки образов между Buildah и Docker? Было бы интересно.
avatar
ci0tt9kk 30.03.2026
Отличная статья! Buildah реально упрощает жизнь в CI/CD, когда не нужен лишний демон.
avatar
pb3m1ws 30.03.2026
Не совсем понял про низкоуровневый API. Это для продвинутых пользователей?
avatar
9pteeaq 30.03.2026
Актуально. В новых проектах как раз переходим на Buildah для большей гибкости.
Вы просмотрели все комментарии