背景
我们今天遇到的问题是在中国大陆服务器上, Docker 拉取托管于 ghcr.io 的 Image 极端缓慢。
原理及方案
Docker 的通信协议基于标准 http,可以通过反代并替换对应的字符串来完成劫持对应的 manifest 文件。
配置文件
因为是在新服务器上配置,所以选择了易于配置的 Caddy。
ghcr.io 选择将 API 和 Image 二进制文件 在不同的服务器上提供,通过 HTTP 307 从 API 跳转到文件服务器,因此我们也对应需要配置两个 vhost,可以被部署在不同的服务器上。
警告
这个配置文件依赖ueffel/caddy-brotli和caddyserver/replace-response,请使用caddy自行编译。
Caddyfile (API-server)
ghcr.example.com {
encode br gzip
log {
output stdout
}
reverse_proxy {
to https://ghcr.io
header_up Host ghcr.io
header_down Location pkg-containers.githubusercontent.com pkg.example.com
}
replace {
ghcr.io ghcr.example.com
}
}
Caddyfile (Binary Server)
pkg.example.com {
reverse_proxy {
to https://pkg-containers.githubusercontent.com
header_up Host pkg-containers.githubusercontent.com
}
}
使用
将 ghcr.io 的镜像对应替换为 ghcr.example.com,即可正常 pull。
样例
docker pull ghcr.io/zxilly/yearmaps:latest
# to
docker pull ghcr.example.com/zxilly/yearmaps:latest
回复 kovacs 取消回复