如何缓存 snapcraft cleanbuild 的包?

如何缓存 snapcraft cleanbuild 的包?

snapcraft cleanbuild应该可以让我在洁净室环境中构建 snap。因此,它从最小的 LXD 镜像开始并安装必要的软件包。但是,它似乎使用基本镜像archive.ubuntu.com,速度非常慢。我如何缓存它下载的软件包?

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

答案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。

相关内容