無法拉取 gcr.io 鏡像?用魔法來打敗魔法
目前常用的 Docker Registry 公開服務(wù)有:
docker.io:Docker Hub 官方鏡像倉庫,也是 Docker 默認的倉庫gcr.io、k8s.gcr.io:谷歌鏡像倉庫quay.io:Red Hat 鏡像倉庫ghcr.io:GitHub 鏡像倉庫
當使用 docker pull 倉庫地址/用戶名/倉庫名:標簽 時,會前往對應(yīng)的倉庫地址拉取鏡像,標簽無聲明時默認為 latest, 倉庫地址無聲明時默認為 docker.io 。

眾所周知的原因,在國內(nèi)訪問這些服務(wù)異常的慢,甚至 gcr.io 和 quay.io 根本無法訪問。

解決方案:鏡像加速器
針對 Docker Hub ,Docker 官方和國內(nèi)各大云服務(wù)商均提供了 Docker 鏡像加速服務(wù)。
你只需要簡單配置一下(以 Linux 為例):
sudo?mkdir?-p?/etc/docker
sudo?tee?/etc/docker/daemon.json?<<-'EOF'
{
??"registry-mirrors":?["鏡像加速器"]
}
EOF
sudo?systemctl?daemon-reload
sudo?service?docker?restart
便可以通過訪問國內(nèi)鏡像加速器來加速 Docker Hub 的鏡像下載。

不過這種辦法也只能針對 docker.io ,其它的倉庫地址并沒有真正實際可用的加速器(至少我目前沒找到)。
解決方案:用魔法打敗魔法
既然無法治本,那治治標還是可以的吧。
若我們使用一臺魔法機器從 gcr.io 或 quay.io 等倉庫先把我們無法下載的鏡像拉取下來,然后重新上傳到 docker.io ,是不是就可以使用 Docker Hub 的鏡像加速器來下載了。

鏡像倉庫遷移的功能,我這里采用了 Go Docker SDK ,整體實現(xiàn)也比較簡單。

以需要轉(zhuǎn)換的 gcr.io/google-samples/microservices-demo/emailservice:v0.3.5 為例,使用方式:

功能實現(xiàn)了,剩下的就是找臺帶有魔法的機器了。
GitHub Actions 就是個好選擇,我們可以利用提交 issues 來觸發(fā)鏡像倉庫遷移的功能。
workflow 的實現(xiàn)如下:

實際的使用效果:

只要執(zhí)行最終輸出的命令,就可以飛快的使用 Docker Hub 的加速器下載 gcr.io 或 quay.io 等鏡像了。
最后
本篇的實現(xiàn)已放在 GitHub :https://github.com/togettoyou/hub-mirror
完~
