我有以下情况:
我需要在奇点容器中安装软件,但该容器在几个点上会失败。每次失败时,我都需要重新启动构建过程。
然后,它将重新下载很多东西,这需要花费大量时间。
是否有任何命令或创建命令的可能性,以便我可以输入:
cachenetwork singularity build ...
然后cachenetwork
抓取所有下载请求,如果尚未下载则下载并缓存它们,如果已下载则从本地文件系统返回文件,就好像它是通过原始 URL 下载的一样?
例如,singularity 尝试下载https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-9-2_9.2.148-1_amd64.deb
,首先,它只是下载文件并返回。第二次访问 URL 时,它将返回例如的内容.cache/networkcache/$(md5sum https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-9-2_9.2.148-1_amd64.deb)/cuda-9-2_9.2.148-1_amd64.deb
。
这应该是可以做到的。但我不知道该怎么做。不设置复杂的代理是否可以做到这一点?
这确实会很有帮助。
答案1
不,我认为你对复杂性的评估是错误的。实际上,告诉程序发送请求比神奇地拦截连接要简单得多。
实现“cachenetwork”
程式实际上并没有此类“下载请求”仅发送给操作系统 – 它们仅要求操作系统打开底层 TCP 连接,然后完全自行使用 HTTP 协议。操作系统不知道所请求的 URL(实际上它甚至不知道该连接是否用于 HTTP)。
因此,您的第一个问题是没有简单的 API 来检测正在下载的内容——在弄清楚如何让操作系统通过您的工具重定向所有连接(例如使用 iptables“tproxy”)之后,您需要自己实际解释这些 HTTP 请求(就好像您是服务器一样)并提供欺骗响应。
这实际上是确切地代理的作用是什么。如果您编写了这样的工具,那么您最终会编写一个除了名称之外的所有 HTTP 代理。(大多数现有的 HTTP 代理软件都可以为您提供缓存,其中一些甚至具有 tproxy 集成,又称“透明代理”模式。)
第二个问题是,由于你的构建器实际上从HTTPS网站(而不是纯文本 http://),TCP 连接的所有内容都经过加密,并且 HTTP 请求详细信息仅有的程序可以看到。是的,SSL/TLS 是还由程序本身处理,甚至本地操作系统也无法解密数据。
因此,您不仅需要充当一个虚假的 HTTP 服务器,还需要充当一个虚假的 SSL/TLS 服务器——程序会注意到,因为 SSL/TLS 中“证书”的全部意义就是让这种情况变得不可能。
(当然,你仍然可以让它工作在你自己您可以通过禁用主机验证或颁发自己的证书并将其标记为本地受信任来阻止系统访问您的 HTTP 代理。该功能也可以在某些现有的 HTTP 代理软件中找到。
我猜像这样的各种东西就是使代理看起来很复杂。
缓存apt
包
除了通用的缓存 HTTP 代理之外,还有一些专门用于缓存 Apt 包下载的程序,例如apt-cacher-ng。
如果用作普通代理,它们仍然会遇到与任何其他代理完全相同的 HTTPS 问题。但是,正如链接的文章所示,只要你能更改存储库 URL在 apt 中source.list
,即使使用 HTTPS,也可以“重新映射”它并使其可缓存。因此,您只需找到 Singularity 存储其download.nvidia.com
根 URL 的位置。