Buildah — сборка OCI-образов без Docker-демона | Глоссарий FREEHOSTING

Buildah

OCI Image Builder
Buildah — Buildah — утилита для сборки OCI-совместимых образов контейнеров без запущенного демона Docker. Позволяет создавать образы из Dockerfile или скриптами на bash/Python, работает в rootless-режиме.

Определение простыми словами

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 — монтировать файловую систему контейнера и копировать артефакты между этапами.