Я экспериментирую с такими инструментами, как Docker и nix, чтобы посмотреть, есть ли современное решение для создания ада зависимости от среды.
Docker не знает и не может кэшировать пакеты, загруженные в среде (обычно Linux), внутри контейнера; он кэширует промежуточные части сборки для каждой строки в вашем Dockerfile, но если ваша раздутая зависимость вытягивает половину ubuntu из apt, Docker будет загружать ее с нуля каждый раз, когда вы меняете что-либо над ней в нашем Dockerfile.
Похоже, что у Nix есть многообещающая инфраструктура для поддержания дерева зависимостей, а также совместного использования/кеширования зависимостей любого количества версии, но не обеспечивает изоляцию почти так же сильно; процессы по умолчанию по-прежнему смогут получить доступ ко всему вашему дереву; они созданы для того, чтобы проходить через дерево nix только для общих библиотек и тому подобного.
Есть ли какой-нибудь разумный способ объединить преимущества nix и Docker (или какого-либо другого существующего инструмента), чтобы кэширование двоичных файлов и инкапсуляция работали одновременно?
Некоторые идеи:
- Docker + локальное зеркало ubuntu + btrfs для кэширования?
- nix + chroot с флагом, чтобы сохранить общую базу данных nix?
Обратите внимание: меня интересует что-то, не зависящее от языка/экосистемы и имеющее хороший охват библиотек с открытым исходным кодом.