runsisi's

technical notes

Alpine 上构建 apk 工具

2020-03-20 runsisi#docker

以前构建出来的 Ceph apk 包都是直接拷贝到 Alpine 容器里进行安装测试,突然想到要放 web 服务器上进行一下测试,才发现完全不可行。

容器里 Ceph 使用的是放在本地局域网 web 服务器上的源,而其它依赖都是使用的是 Alpine 官方的 apk 源,下载 Ceph 时需要从本地局域网进行下载,而相关的依赖需要从 Alpine 官方下载,因此这里涉及到 HTTP 代理的设置,本来我以为设置上 http/https_proxy 以及 no_proxy 就万事大吉了,但不论怎么设置 no_proxy,apk update 获取 Ceph 源索引总是返回 403 错误,但是我从服务端日志里根本就没有看到有相应的 HTTP 请求,折腾一圈,最后通过 tcpdump 确认请求都转发到代理服务器了,看来问题出在 apk 本身。

通过阅读 apk 源代码,确实发现这是 apk 工具包含的 libfetch 源代码的问题,非常简单的一个修改(libfetch: fix no_proxy match),而上游也早就修改了该问题。

这里简单记录一下 apk 工具的构建过程:

# apk add alpine-sdk
# apk add openssl-dev
# apk add linux-headers
# apk add zlib-dev
# apk add lua5.3-dev
# apk add zlib-static
# apk add openssl-libs-static

# git clone https://github.com/alpinelinux/apk-tools.git
# cd apk-tools/
# make static

# ldd src/apk.static
        /lib/ld-musl-x86_64.so.1 (0x7f63e012e000)
# ldd src/apk
        /lib/ld-musl-x86_64.so.1 (0x7f3ada8f4000)
        libssl.so.1.1 => /lib/libssl.so.1.1 (0x7f3ada837000)
        libcrypto.so.1.1 => /lib/libcrypto.so.1.1 (0x7f3ada5bb000)
        libz.so.1 => /lib/libz.so.1 (0x7f3ada5a1000)
        libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f3ada8f4000)

其实主要是记录一下依赖包的名字:)