05月09, 2024

使用image-syncer镜像同步工具将阿里云镜像仓库镜像迁移至私有Harbor

借助于阿里云开源的镜像同步工具image-syncer实现harbor及阿里云镜像仓库之间的镜像迁移

下载镜像同步工具

curl -fL "https://wiseo-generic.pkg.coding.net/wiseo/tools/image-syncer?version=latest" -o image-syncer && chmod 777 image-syncer 

编写配置文件auth.yaml,模板如下

quay.io: #支持 "registry""registry/namespace"(v1.0.3之后的版本) 的形式,image-syncer 会自动为镜像同步规则中的每个源/目标 url 查找认证信息,并且使用对应认证信息进行进行访问,如果匹配到了多个,用“最长匹配”的那个作为最终结果
  username: xxx
  password: xxxxxxxxx
  insecure: true # 可选,(v1.0.1 之后支持)registry是否是http服务,如果是,insecure 字段需要为 true,默认是 false
registry.cn-beijing.aliyuncs.com:
  username: xxx # 可选,(v1.3.1 之后支持)value 使用 "${env}" 或者 "$env" 形式可以引用环境变量
  password: xxxxxxxxx # 可选,(v1.3.1 之后支持)value 使用 "${env}" 或者 "$env" 类型的字符串可以引用环境变量
docker.io:
  username: "${env}"
  password: "$env"
quay.io/coreos:
  username: abc
  password: xxxxxxxxx
  insecure: true

编写镜像迁移文件 images.ymal

说明

registry.cn-shanghai.aliyuncs.com/namespace/projectname: harbor地址/namespace/projectname

同步镜像

./image-syncer --proc=6 --auth=./auth.yaml --images=./images.yaml --retries=3 --log=./log

  • 每条镜像同步规则为一个 “源镜像 url: 目标镜像 url” 的键值对。无论是源镜像 url 还是目标镜像 url,字符串格式都和 docker pull 命令所使用的镜像 url 大致相同(registry/repository:tag、registry/repository@digest),但在 tag 和 digest 配置上和 docker pull 所使用的 url 存在区别,这里对整体逻辑进行描述:

  • 源镜像 url、目标镜像 url 都不能为空

  • 源镜像 url 不包含 tag 和 digest 时,代表同步源镜像 repository 中的所有镜像 tag

  • 源镜像 url 可以包含一个或多个 tag,多个 tag 之间用英文逗号分隔,代表同步源镜像 repository 中的多个指定镜像 tag

  • 源镜像 url 可以但最多只能包含一个 digest,此时如果目标镜像 url 包含 digest,digest 必须一致

  • 源镜像 url 的 "tag" 可以是一个正则表达式,需要额外在首尾加上 / 字符作为标识,源镜像 repository 中所有匹配正则表达式的镜像 tag 会被同步,不支持多个正则表达式 目标镜像 url 可以不包含 tag 和 digest,表示所有需同步的镜像保持其镜像 tag 或者 digest 不变

  • 目标镜像 url 可以包含多个 tag 或者 digest,数量必须与源镜像 url 中的 tag 数量相同,此时,同步后的镜像 tag 会被修改成目标镜像 url 中指定的镜像 tag(按照从左到右顺序对应) 支持同时指定多个目标镜像 url,此时 "目标镜像 url" 为数组的形式,数组的每个元素(字符串)都需要满足前面的规则

quay.io/coreos/kube-rbac-proxy: quay.io/ruohe/kube-rbac-proxy
quay.io/coreos/kube-rbac-proxy:v1.0: quay.io/ruohe/kube-rbac-proxy
quay.io/coreos/kube-rbac-proxy:v1.0,v2.0: quay.io/ruohe/kube-rbac-proxy
quay.io/coreos/kube-rbac-proxy@sha256:14b267eb38aa85fd12d0e168fffa2d8a6187ac53a14a0212b0d4fce8d729598c: quay.io/ruohe/kube-rbac-proxy
quay.io/coreos/kube-rbac-proxy:v1.1:
  - quay.io/ruohe/kube-rbac-proxy1
  - quay.io/ruohe/kube-rbac-proxy2
quay.io/coreos/kube-rbac-proxy:/a+/: quay.io/ruohe/kube-rbac-proxy

更多参数

image-syncer 的使用比较简单,但同时也支持多个命令行参数的指定:

-h  --help       使用说明,会打印出一些启动参数的当前默认值

    --config     设置用户提供的配置文件路径,使用之前需要创建此文件,默认为当前工作目录下的config.json文件。这个参数与 --auth和--images 
                 作用相同,分解成两个参数可以更好地区分认证信息与镜像仓库同步规则。建议使用 --auth  --images.

    --auth       设置用户提供的认证文件所在路径,使用之前需要创建此认证文件,默认为当前工作目录下的auth.json文件

    --images     设置用户提供的镜像同步规则文件所在路径,使用之前需要创建此文件,默认为当前工作目录下的images.json文件

    --log        打印出来的log文件路径,默认打印到标准错误输出,如果将日志打印到文件将不会有命令行输出,此时需要通过cat对应的日志文件查看

    --proc       并发数,进行镜像同步的并发goroutine数量,默认为5

    --retries    失败同步任务的重试次数,默认为2,重试会在所有任务都被执行一遍之后开始,并且也会重新尝试对应次数生成失败任务的生成。一些偶尔出现的网络错误比如io timeout、TLS handshake timeout,都可以通过设置重试次数来减少失败的任务数量

    --os         用来过滤源 tag  os 列表,为空则没有任何过滤要求,只对非 docker v2 schema1 media 类型的镜像格式有效

    --arch       用来过滤源 tag  architecture 列表,为空则没有任何过滤要求

    --force      同步已经存在的、被忽略的镜像,这个操作会更新已存在镜像的时间戳

本文链接:https://587v5.com/post/shi-yong-image-syncer-jing-xiang-tong-bu-gong-ju-jiang-a-li-yun-jing-xiang-cang-ku-jing-xiang-qian-yi-zhi-si-you-Harbor.html

Comments