背景
我们今天遇到的问题是在中国大陆服务器上, 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
发表回复