“ image-syncer
是一个容器镜像同步工具,可用来进行多对多的镜像仓库同步,支持目前绝大多数主流的 docker 镜像仓库服务 ”
01
—
镜像仓库迁移或同步需求
企业容器化是需要一个容器镜像仓库的,不管是自建还是使用云镜像仓库服务,镜像仓库之间的同步是一个避免不了的需求,Harbor的复制服务可以从远端仓库复制过来或者推送到远端仓库,如下图:

但是非Harbor的镜像仓库,只是少部分我们还可以先tag,然后使用docker pull或者push的方式,大批量的镜像复制怎么处理呢?这个时候我们可以使用image-syncer。
02
—
image-syncer简介
Github地址:https://github.com/AliyunContainerService/image-syncer
image-syncer 是一个容器镜像同步工具,可用来进行多对多的镜像仓库同步,支持目前绝大多数主流的 docker 镜像仓库服务。
支持多对多镜像仓库同步
支持基于 Docker Registry V2 搭建的镜像仓库服务 (如 Docker Hub、 Quay、 阿里云镜像服务 ACR、 Harbor 等)
同步过程只经过内存和网络,不依赖磁盘存储,同步速度快
自动增量同步, 自动忽略已同步且不需要修改的镜像
支持镜像层级别的并发同步,可以通过配置文件调整并发数(可以理解为同一时间在同步的镜像层数量上限)
自动重试失败的同步任务,可以解决大部分镜像同步中的偶发问题(限流、网络抖动),支持重试次数配置
简单轻量,不依赖 docker 以及其他程序
03
—
image-syncer部署安装
1、编译安装
go get github.com/AliyunContainerService/image-syncercd $GOPATH/github.com/AliyunContainerService/image-syncermake
2、直接使用编译好的release
#v1.3.1版本为例wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.3.1/image-syncer-v1.3.1-linux-amd64.tar.gztar -zvxf image-syncer-v1.3.1-linux-amd64.tar.gz
3、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 同步已经存在的、被忽略的镜像,这个操作会更新已存在镜像的时间戳
04
—
quay.io: #支持 "registry" 和 "registry/namespace"(v1.0.3之后的版本) 的形式,image-syncer 会自动为镜像同步规则中的每个源/目标 url 查找认证信息,并且使用对应认证信息进行进行访问,如果匹配到了多个,用“最长匹配”的那个作为最终结果username: xxxpassword: xxxxxxxxxinsecure: true # 可选,(v1.0.1 之后支持)registry是否是http服务,如果是,insecure 字段需要为 true,默认是 falseregistry.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: abcpassword: xxxxxxxxxinsecure: true
quay.io/coreos/kube-rbac-proxy: quay.io/ruohe/kube-rbac-proxy#华为云两个镜像服务地址之间同步swr.cn-north-4.myhuaweicloud.com/org-ss/canary-consumer: swr.cn-east-3.myhuaweicloud.com/dev-container/canary-consumerquay.io/coreos/kube-rbac-proxy:v1.1:- quay.io/ruohe/kube-rbac-proxy1- quay.io/ruohe/kube-rbac-proxy2
源镜像 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" 为数组的形式,数组的每个元素(字符串)都需要满足前面的规则
#1./image-syncer --proc=6 --auth=./auth.json --images=./images.json --auth=./auth.json --retries=3#2./image-syncer --auth=./auth.json --images=./images.json --namespace=dev-container --registry=swr.cn-east-3.myhuaweicloud.com --retries=3 --log=./log

文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




