Иногда работа заставляет собирать проекты через 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