找了有两个开源项目比较不错,都可以完成镜像的迁移。

crpy 的使用

crpy 使用 python 开发,有本地缓存,拉取和推送镜像速度比较快。使用体验比较接近 docker。
开源地址: https://github.com/bvanelli/crpy

安装

1
2
# 也可以安装到虚拟环境
pip install crpy

认证

1
crpy login registry.cn-hangzhou.aliyuncs.com -u <username> -p <password>

认证信息存储在:~/.crpy/config.json

拉取镜像

1
crpy pull nginx:1.29 nginx_1.29.tar

缓存数据存储在:~/.crpy/blobs

推送镜像

1
crpy push nginx_1.29.tar registry.cn-hangzhou.aliyuncs.com/iuxt/nginx:1.29

crane 的使用

这个工具是 Golang 写的,支持 Windows,单文件直接运行,比较方便,支持指定架构。

https://github.com/google/go-containerregistry/blob/main/cmd/crane/README.md

安装

在:https://github.com/google/go-containerregistry/releases 下载二进制文件即可。

认证

1
crane auth login registry.cn-hangzhou.aliyuncs.com -u <username> -p <password>

认证信息存储在:~/.docker/config.json

拉取镜像

1
2
# --platform linux/arm64 可以指定拉取特定架构的镜像
crane pull --platform linux/arm64 nginx:1.27 nginx_1.27.tar

推送镜像

1
crane push ./nginx_1.27.tar registry.cn-hangzhou.aliyuncs.com/iuxt/nginx:1.27

同步镜像

同步镜像会根据两个仓库的镜像摘要来确定是否同步对应的层,如果指定的层目标已存在是不会进行同步的,同步会更高效。

1
crane copy --platform linux/amd64 nginx:1.27 registry.cn-hangzhou.aliyuncs.com/iuxt/nginx:1.27

查看仓库里有哪些 tag

1
crane ls registry.cn-hangzhou.aliyuncs.com/iuxt/nginx

SSRF 报错的处理

1
2
Copying from registry.example.com/pro/rocketmq:server-4.5.1 to swr.dxh2-region-1.example.com.cn/prod/rocketmq:server-4.5.1
Error: Get "http://10.83.4.204:8060/devcloud-harbor/docker/registry/v2/blobs/sha256/87/87f6448314a7875ede6e8150de14e9ca30624fa9ede39425b89ea4bec2323331/data?X-Amz-Algorithm=REDACTED&X-Amz-Credential=REDACTED&X-Amz-Date=REDACTED&X-Amz-Expires=REDACTED&X-Amz-Signature=REDACTED&X-Amz-SignedHeaders=REDACTED": SSRF protection: redirect from "registry.example.com" to private/link-local host"10.83.4.204" denied

这个报错是 crane(底层使用 go-containerregistry)的 SSRF 安全防护机制触发的。源仓库 registry.example.com 在返回镜像 blob 数据时,通过 HTTP 重定向把请求指向了内网地址 10.83.4.204:8060,而 crane 的安全策略默认拒绝从公网域名重定向到私有/链路本地地址,以防止服务端请求伪造攻击。

可以使用旧版本 0.21.1 ,这个版本没有这个限制。