我正在尝试使用 Docker 和 nix 等工具,看看是否有现代解决方案来构建环境依赖地狱。
Docker 不知道也没有能力缓存在容器内(通常是 linux)环境中下载的包;它确实为 Dockerfile 中的每一行缓存了构建的中间部分,但是如果你的臃肿依赖从 apt 中提取了一半的 ubuntu,那么只要你在 Dockerfile 中更改它上面的任何内容,Docker 就会从头开始下载它。
Nix 似乎有很好的基础设施来维护依赖树,以及共享/缓存任意数量版本的依赖关系,但并没有那么强烈地强制隔离;默认情况下,进程仍然可以访问您的整个树;它们被构建为仅通过共享库等的 nix 树。
是否有一些理智的方法可以结合 nix 和 Docker(或其他一些现有工具)的优点来同时缓存二进制文件和封装工作?
一些想法:
- Docker+本地ubuntu镜像+btrfs实现缓存?
- nix + chroot 带有一个标志来保持 nix 数据库共享?
请注意,我对与语言/生态系统无关的东西感兴趣,并且对开源库有很好的覆盖。