Distrobox как инструмент разработчика


Distrobox - это opensource проект, по сути - большой набор shell-скриптов, который при помощи выбранного бэкэнда (docker, podman, с недавних пор еще lilipod) позволяет запускать контейнеры популярных Линукс дистрибутивов. При этом мы получаем доступ к всему диапазону программных пакетов конкретного дистрибутива, и сам контейнер близко интегрируются с нашей основной системой, позволяя легко пользоваться приложениями внутри контейнера.

Зачем такое нужно?

Можно использовать какой-нибудь стабильный дистрибутив Linux, вроде Ubuntu, Debian, даже незименяемые дистрибутивы, вроде Fedora Sliverblue, и при этом иметь полный доступ к вообще любым репозиториям софта, которые существуют среди популярных дистрибутивов: ArchLinux, openSUSE Tumbleweed и т.д.

Всё мои инструменты для работы находятся в удобной bleeding-edge коробочке, где я могу иметь самое свежее ПО, при этом без необходимости настраивать репозитории и засорять свою систему большим количеством софта и библиотек.

Может запускать даже графические и аудио-приложения (есть даже вариант использования рабочего стола GNOME или KDE полностью из контейнера, инструкция если кому интересно, но мне кажется это перебор :).

Кроме того:

  • Rootless установка программ.
  • Совместимость программы с нашей системой не важна.
  • Изоляция программ от основной системы.
  • Установка программ на компьютере с ограниченными правами, или на атомных дистрибутивах.

Всё это, естественно, возможно и при управлениями контейнерами “вручную”, но Distrobox здорово упрощает весь этот процесс, например, создать контейнер для Убунты максимально просто:

# создание обычного контейнера Ubuntu
distrobox create -i ubuntu:20.04

Далее мы можем просто зайти “внутрь” контейнера:

distrobox enter ubuntu

и установить любые программы, которые доступны с apt на Ubuntu.

apt-get install ripgrep

И всё: можно использовать rg, в том числе для поиска на своей основной системе. Чтобы не “заходить” каждый раз внутрь контейнера для запуска приложений, возможно также “экспортировать” их наружу:

distrobox-export --bin `which rg`

Теперь мы можем использовать ripgrep напрямую, export создал для нас удобный скрипт, который фоном запустит контейнер с приложением и выполнит команду.

Зачем такое не нужно?

Distrobox всё-таки не обеспечивает 100% безопасную песочницу, т.к. интегрирует контейнеры с основной системой. Если нам нужна надежная изоляция для нашей работы, правильно всё таки использовать обычные docker/podman или иные средства виртуализации.

Чем Distrobox может быть интересен разработчику?

  • Быстро получаем воспроизводимую среду для разработки.
  • Устанавливаем библиоткеки, редакторы/IDE, дебаггеры (например, легко можно использовать последнюю версию Neovim внутри Distrobox)
  • Можем использовать разные версии программ в разных контейнерах.
  • Если чего-то нет в репозитории конкретного дистрибутива, всега можно создать еще один.

Еще один плюс: декларативные описания среды контейнера. Поддерживается создание заранее настроенных конфиг-файлом контейнеров, с предустановленными приложениями с distrobox-assemble. Описанный нами в *.ini файле контейнер, можно запустить на любой машине, где установлен Distrobox, и сразу начать работать. Затем можно удалить контейнер, пересоздать, запустить несколько точно таких же на другом компьютере.

Для интерисующихся ML-инженерией будет интересно, что можно легко получить настроенную среду с Pytorch и всеми GPU драйверами (AMD драйвер насколько мне известно, поддерживает работу прямо из контейнера, NVidia дожны быть установлены всё-таки и на основной системе и продублированы в контейнера).

Что умеет еще?

Distrobox в целом делает работу со своими контейнерами очень просто, например, все контейнеры можно проапдейтить одной командой.

Ещё один интересный вариант использования: наши контейнеры могу включать init-систему systemd. А это открывает нам окно, для, например, использования docker’а изнутри podman контейнера без необходимости установки его на базовой системе.

Выводы

В целом это один из самых интересных инструментов для Linux, с которыми я встречался, и также это ещё один шажок в стороту того, что конкретный дистрибутив и его пакетный менеджер становятся всё менее важны сами по себе, и в целом от Linux мы лишь хотим устойчивую среду для запуска наших приложений в контейнерах или форматах приложений вроде Flatpak или AppImage.