Определение простыми словами
Buildah — инструмент командной строки для сборки образов контейнеров в формате OCI (Open Container Initiative). В отличие от Docker, он не требует постоянно работающего фонового демона и может запускаться от имени обычного пользователя без прав root. Это делает его безопаснее в CI/CD-окружениях и на серверах с ограниченными привилегиями.
Buildah входит в экосистему Red Hat вместе с Podman и Skopeo. Podman запускает контейнеры, Skopeo копирует образы между реестрами, а Buildah их собирает. Все три утилиты работают с одним и тем же хранилищем образов и не конфликтуют друг с другом.
Сравнение
| Критерий | Buildah | Docker Build | Kaniko |
|---|---|---|---|
| Демон | Не нужен | Требует dockerd | Не нужен |
| Rootless | Да (полный) | Ограниченно | Нет (root в поде) |
| Dockerfile | Да + нативный API | Только Dockerfile | Только Dockerfile |
| Интеграция с Kubernetes | Через podman/buildah pod | DinD (небезопасно) | Нативная (Job) |
| Скорость сборки | Сопоставима с Docker | Высокая (BuildKit) | Медленнее на больших слоях |
Кейсы использования
- CI/CD без привилегий. GitLab Runner или GitHub Actions выполняют сборку образов в rootless-режиме — не нужен Docker-in-Docker с privileged: true.
- Многоэтапные сборки. Buildah поддерживает multi-stage Dockerfile и позволяет монтировать артефакты между этапами через
buildah mount. - Скриптовая сборка без Dockerfile. Образ собирается прямо в bash-скрипте: добавляются слои, настраиваются метаданные, всё фиксируется командой commit.
- Минимальные образы. Можно создать образ с нуля (scratch), добавив только нужные бинари — без базового дистрибутива.
- Интеграция с реестрами. Buildah напрямую пушит образы в Docker Hub, Quay.io, Harbor и приватные реестры через
buildah push.
Негативный пример: Использовать Buildah для запуска контейнеров — он для этого не предназначен. Buildah только собирает и публикует образы; для запуска используйте Podman, containerd или Docker.
Технические детали
Типичный цикл сборки и публикации образа:
# Инициализация нового контейнера на базе образа
buildah from --name myapp-build ubi9/ubi-minimal
# Копирование файлов в контейнер
buildah copy myapp-build ./app /usr/local/bin/app
# Выполнение команд внутри контейнера
buildah run myapp-build -- chmod +x /usr/local/bin/app
# Установка метаданных OCI-образа
buildah config --entrypoint '["/usr/local/bin/app"]' myapp-build
buildah config --label maintainer='ops@example.com' myapp-build
# Фиксация слоя и создание образа
buildah commit myapp-build myapp:1.0.0
# Публикация в реестр
buildah push myapp:1.0.0 docker://registry.example.com/myapp:1.0.0
# Очистка временного контейнера
buildah rm myapp-build
Для rootless-режима убедитесь, что в /etc/subuid и /etc/subgid есть запись для вашего пользователя — минимум 65536 подчинённых UID. Проверить: grep $(whoami) /etc/subuid.
🔥 Где это применяется
Частые вопросы
Чем Buildah отличается от docker build?
Buildah не требует запущенного демона dockerd и поддерживает полный rootless-режим. Кроме Dockerfile, он позволяет собирать образы скриптами через нативный CLI-API, управляя слоями и метаданными напрямую.
Можно ли использовать Buildah вместе с Podman?
Да, они используют общее хранилище образов. Образ, собранный Buildah, сразу доступен для запуска через Podman без дополнительного импорта.
Как установить Buildah на Ubuntu?
На Ubuntu 22.04 и новее достаточно выполнить apt install buildah. На более старых версиях добавьте репозиторий kubic: add-apt-repository ppa:projectatomic/ppa && apt install buildah.
Поддерживает ли Buildah multi-stage сборки?
Да, multi-stage Dockerfile поддерживается полностью. Также можно реализовать многоэтапную сборку вручную через buildah mount — монтировать файловую систему контейнера и копировать артефакты между этапами.