Иногда работа заставляет собирать проекты через docker compose. Но что делать, если Docker мешается, не дружит с nftables и в целом не хочется держать лишний демон от root? Тут на помощь приходит Podman - лёгкий, «бездемонный» и более гибкий инструмент.

В чём загвоздка

Podman умеет запускать проекты Docker Compose двумя способами: через официальный docker compose CLI или через свою обёртку podman-compose. Проблема в том, что оба варианта что-то недотягивают: где-то нет BuildKit, а где-то ломаются фишки вроде configs или перекрёстных ссылок сервисов. В итоге идеального варианта нет.

Как это обойти

Оказалось, что можно всё-таки заставить docker compose работать вместе с Podman и при этом сохранить BuildKit. На Arch Linux это выглядит так:

pacman -S docker-compose docker-buildx
systemctl --user start podman.socket
docker context create podman --docker host=unix://$XDG_RUNTIME_DIR/podman/podman.sock
docker context use podman

После этих шагов Compose прекрасно запускается и даже сам поднимает контейнер с BuildKit. А если хочется больше контроля - можно включить BuildKit как сервис:

pacman -S buildkit
systemctl --user start buildkit.service
docker buildx create --name local unix://$XDG_RUNTIME_DIR/buildkit/rootless
docker buildx use local

Bake и маленькая хитрость

Но раз уж Podman нравится именно за отсутствие демонов, то можно пойти ещё дальше. Любой Compose-проект легко превратить в JSON-описание через Bake:

docker buildx bake --print > bake.json

А дальше автор написал простой инструмент Bakah, который берёт этот JSON и строит образы через Buildah (это библиотека внутри Podman). Так можно собирать даже сложные проекты, не запуская лишние сервисы.

Зачем всё это

Если у тебя сервер без Docker, но нужно использовать Compose и при этом сохранить ускорение от BuildKit - этот способ отлично работает. Получается лёгко, удобно и без головной боли с демонами.

Источник: Using Podman, Compose and BuildKit