如何为snapcraft cleanbuild缓存软件包?

snapcraft cleanbuild应该让我在干净的环境中构建snaps。因此,它从一个最小的LXD镜像开始,并安装必要的软件包。然而,它似乎使用了极其缓慢的archive.ubuntu.com镜像。我该如何缓存它下载的软件包?

我可以设置apt-cacher-ng或其他缓存代理,但仍然存在将snap/LXD组合使用它的问题。最好是它有一个像pbuilder那样的内部缓存,但如果没有,那么我该如何说服它使用不同的镜像或代理来获取镜像?


你能试试从这个链接 https://insights.ubuntu.com/2016/03/16/lxd-2-0-installing-and-configuring-lxd-212/ 上的参考文档中配置代理吗? - user.dz
1除非我搞错了,这是用于LXD守护程序的配置,而不是用于LXD容器的配置。无论如何,我已经安装了apt-cacher-ng,并根据那些实例将其设置为代理,但是运行新的snapcraft cleanbuild时并没有使用它(apt-cacher-ng在日志或缓存目录中没有任何更改)。 - muru
1配置已生效:a-c-ng不喜欢HTTPS CONNECT请求,我必须取消HTTPS代理设置才能使LXD重新正常工作。 - muru
你觉得通过修改hosts文件(至少是暂时地)将目标连接重定向到一个拥有你所需缓存包的服务器,你能达到你想要的效果吗? - b_laoshi
@b_laoshi 这需要在容器中完成,而不是主机服务器。如果我能这样做,我将能够编辑“sources.list”或“apt.conf”以设置不同的镜像或代理。但是,Snapcraft会设置容器并开始构建,而不让我有机会做任何事情,似乎手动在Snapcraft启动容器后尝试这样做是一种竞争的方式。 - muru
1这是一篇很好的文章,详细介绍了如何在主机上使用软件包代理,并配置lxd来使用它。 - popey
1@popey 谢谢!你能写一个总结性的答案吗?我使用了environment.http_proxy而不是user.user-data/apt,并且使用了更通用的squid/apt-cacher-ng代理而不是squid-deb-proxy,但核心思想是一样的。 - muru
@muru 如果popey不回答的话,你会考虑自己回答你的问题吗?这样可以缩短我们浏览“未回答列表”的时间。谢谢! - WinEunuuchs2Unix
1个回答

基本原则如popey的建议所述有效:
  1. 在主机上(或其他位置,根据您的喜好,我将假设主机)设置缓存代理:apt-cacher-ng、squid-deb-proxy 或 squid 本身。
  2. 获取主机 IP 地址(容器可见):

    export LXD_ADDRESS=$(ip -4 -o address show dev lxdbr0 | awk -F'[ /]*' '{print $4}')
    
  3. 使用它来设置默认配置文件的代理设置:

    printf '%s\n' '#cloud-config' 'apt:' " proxy: http://$LXD_ADDRESS:8000" |
      lxc profile set default user.user-data -
    
  4. 成功!
然而,有几个需要注意的地方。
snapcraft cleanbuild 通过一种与通常的 apt-get 不同的机制下载了许多软件包,这不受此配置的影响。这种荒谬可见于输出的这部分内容:
Preparing to pull glue
Pulling glue
Preparing to pull cassandra
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
...
Get:46 http://archive.ubuntu.com/ubuntu xenial-backports/universe Translation-en [3004 B]
Fetched 26.0 MB in 6s (4237 kB/s)
Get:1 ca-certificates-java_20160321_all.deb [12.9 kB]
Fetched 12.9 kB in 0s (0 B/s)
Get:1 libxdmcp6_1.1.2-1.1_amd64.deb [11.0 kB]
Fetched 11.0 kB in 0s (0 B/s)
Get:1 init-system-helpers_1.29ubuntu4_all.deb [32.3 kB]
Fetched 32.3 kB in 0s (0 B/s)
Get:1 default-jre-headless_1.8-56ubuntu2_amd64.deb [4380 B]
Fetched 4380 B in 0s (0 B/s)
Get:1 default-jdk_1.8-56ubuntu2_amd64.deb [968 B]
Fetched 968 B in 0s (0 B/s)
Get:1 libkrb5-3_1.13.2+dfsg-5ubuntu2_amd64.deb [273 kB]

有相当多这些,而且个别请求让它们变得慢得要命,更不用说之前设置的apt代理设置对它们没有影响。
所以,我改为设置环境变量http_proxy
lxc profile set default environment.http_proxy "http://$LXD_ADDRESS:3128"

同样地,对于HTTPS也是如此,因为容器中的其他下载使用了HTTPS。我通常更喜欢apt-cacher-ng,但它不支持HTTPS CONNECT,所以我转而使用squid。