Периодически возникает задача создания Linux-окружения по некоторому образцу. Например, хочется иметь возможность быстро развернуть новую рабочую машину или сервер. Разные версии одних и тех же пакетов могут вести себя по-разному, поэтому очень хочется избежать сюрпризов и поставить именно тот набор версий, что указан в образце.
В разных языках программирования данная проблема решена в той или ной мере. Например, в Ruby есть bundler и Gemfile.lock, в котором перечислены все версии прямых и транзитивных зависимостей, в Node.js - npm и package-lock.json. Всегда можно попросить пакетный менеджер установить фиксированные версии библиотек.
Для создания серверных воспроизводимых окружений можно использовать Docker или Podman: указываю, что хочу запустить приложение внутри контейнера на некотором образе и я точно уверен, что окружение не поменяется (ну, кроме ядра хоста, конечно).
А что насчет десктопных дистрибутивов?
Возьмем, к примеру, Ubuntu. Можно посмотреть доступные версии пакетов с помощью apt-cache madison
. Если один и тот же пакет предоставляется несолькими репозиториями, то можно выбрать какую именно версию установить. Однако, для одного репозитория доступна только одна версия пакета, т.е. если у меня в официальных репах лежит nginx 1.18.0-6, то в этой репе уже нет 1.18.0-3.
Посмотрел NixOS, слоган которого «Reproducible builds and deployments». С одной стороны я могу указать список пакетов в configuration.nix
, но с другой, если я подсуну конфиг на новую машину, то далеко не факт, что мне установятся те же самые версии пакетов, ведь актуальные версии в репозиториях могли измениться.
Конечно можно сделать как с Docker-ом: скопировать образ диска с помощью dd и накатить на новый хард, но, на мой взгляд, такой подход выглядит несколько костыльно, потому что предполагает, что я взаимодействую с содержимым машины, как с некоторым черным ящиком, а хочется чтобы все было прозрачно, так сказать, configuration as a code.
Понимаю, что эта проблема может быть и не проблемой вовсе в большинстве случаев: если все следуют semver-у, то пакет 1.2.3 будет совместим с 1.2.4 и ничего страшного не произойдет, но в некоторых случаях все же хочется максимального контроля.
Уважаемый ЛОР, что посоветуете по поводу дистрибутива с воспроизводимым окружением?