最近更新时间:2024-11-27 14:06:25
在当今的云计算环境中,用户经常会同时使用公有云镜像仓库和自建仓库,或是多家公有云镜像仓库。这种多元化的使用场景会带来跨平台镜像迁移或同步的需求。迁移过程中,当处理数量较少的镜像任务时,使用命令行迁移即可解决问题。但如果涉及成千上百个镜像,几T的镜像仓库数据时,迁移过程会非常漫长,且存在数据丢失的风险。这时,用户可以使用开源镜像迁移工具image-syncer来处理该任务。
支持多对多镜像仓库同步
支持基于 Docker Registry V2 搭建的镜像仓库服务 (如 Docker Hub、 Quay、金山云容器镜像服务 KCR、 Harbor 等)
镜像同步过程只经过内存和网络,不依赖磁盘存储,同步速度快
自动增量同步, 自动忽略已同步且不需要修改的镜像
支持镜像层级别的并发同步,可以通过配置文件调整并发数(同一时间在同步的镜像层数量上限)
自动重试失败的同步任务,可以解决大部分镜像同步中的偶发问题(限流、网络抖动),支持重试次数配置
简单轻量,不依赖 docker 以及其他程序
详情请参见 image-syncer。
保证image-syncer的运行环境与需要同步的registry网络连通。
下载image-syncer到执行机上,解压并运行工具。
以v1.3.1版本为例,您也可以选择其他版本。
wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.3.1/image-syncer-v1.3.1-linux-amd64.tar.gz
tar -zvxf image-syncer-v1.3.1-linux-amd64.tar.gz
创建镜像仓库的认证信息文件auth.yaml或auth.json,认证信息文件通过 --auth
参数传入。
1、通常镜像源仓库需要具有 pull 以及访问 tags 权限,镜像目标仓库需要拥有 push 以及创建仓库权限;如果对应仓库没有提供认证信息,则默认匿名访问。
2、认证信息中可以同时描述多个 registry(或者 registry/namespace)对象,一个对象可以包含账号和密码。
image-syncer支持基于Docker Registry V2搭建的docker镜像仓库,按格式填写即可。将源仓库及目标仓库认证信息写入,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.ksyunkcr.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.json或images.yaml,镜像同步规则文件以 --images
参数传入。
每条镜像同步规则为一个 “源镜像 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" 为数组的形式,数组的每个元素(字符串)都需要满足前面的规则
images.yaml内容示例如下:
quay.io/coreos/kube-rbac-proxy: registry.ksyunkcr.com/namespace/repository
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
./image-syncer --auth=./auth.yaml --images=./images.yaml --retries=3 --log=./log
image-syncer 的使用比较简单,但同时也支持多个命令行参数的指定:
参数 | 说明 |
--help | 使用说明,会打印出一些启动参数的当前默认值. |
--config | 设置用户提供的配置文件路径,使用之前需要创建此文件,默认为当前工作目录下的config.json文件。这个参数与 --auth和--images 的作用相同,分解成两个参数可以更好地区分认证信息与镜像仓库同步规则。建议使用 --auth 和 --images. |
--images | 设置用户提供的镜像同步规则文件所在路径,使用之前需要创建此文件,默认为当前工作目录下的images.json文件 |
--auth | 设置用户提供的认证文件所在路径,使用之前需要创建此认证文件,默认为当前工作目录下的auth.json文件 |
--log | 打印出来的log文件路径,默认打印到标准错误输出,如果将日志打印到文件将不会有命令行输出,此时需要通过cat对应的日志文件查看 |
--namespace | 设置默认的目标namespace,当配置文件内一条images规则的目标仓库为空,并且默认registry也不为空时有效,可以通过环境变量DEFAULT_NAMESPACE设置,同时传入命令行参数会优先使用命令行参数值。 |
--proc | 并发数,进行镜像同步的并发goroutine数量,默认为5 |
--retries | 失败同步任务的重试次数,默认为2,重试会在所有任务都被执行一遍之后开始,并且也会重新尝试对应次数生成失败任务的生成。一些偶尔出现的网络错误比如io timeout、TLS handshake timeout,都可以通过设置重试次数来减少失败的任务数量 |
--os | 用来过滤源 tag 的 os 列表,为空则没有任何过滤要求,只对非 docker v2 schema1 media 类型的镜像格式有效 |
--arch | 用来过滤源 tag 的 architecture 列表,为空则没有任何过滤要求 |
--force | 同步已经存在的、被忽略的镜像,这个操作会更新已存在镜像的时间戳 |
--registry | 设置默认的目标registry,当配置文件内一条images规则的目标仓库为空,并且默认namespace也不为空时有效,可以通过环境变量DEFAULT_REGISTRY设置,同时传入命令行参数会优先使用命令行参数值。 |
迁移命令执行后,可登录目标镜像仓库,查看已迁移的镜像。
该示例为镜像从KCR个人版实例迁移到KCR企业版实例的过程演示。
下载image-syncer到执行机上,解压并运行工具。
wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.3.1/image-syncer-v1.3.1-linux-amd64.tar.gz
tar -zvxf image-syncer-v1.3.1-linux-amd64.tar.gz
创建镜像仓库的认证信息文件auth.yaml。
registry.ksyunkcr.com:
username: zhouhanjing # KCR企业版仓库用户名
password: abcdef1234567 # KCR企业版仓库密码
hub.kce.ksyun.com:
username: zhouhanjing #KCR个人版仓库用户名
password: 12345678 #KCR个人版仓库密码
创建同步镜像描述文件images.yaml。
# KCR个人版仓库访问域名/命名空间/仓库 : KCR企业版仓库访问域名/命名空间/仓库
hub.kce.ksyun.com/nszhj/repozhj: registry.ksyunkcr.com/namespace/repository
执行如下命令将镜像从KCR个人版实例迁移至KCR企业版实例。
./image-syncer --auth=./auth.yaml --images=./images.yaml --retries=3 --log=./log
迁移命令执行后,可登录KCR企业版仓库,查看已迁移的镜像。
纯净模式
鼠标选中内容,快速反馈问题