Docker image synchronization tool for Docker Registry V2 based services
APACHE-2.0 License
image-syncer
是一个容器镜像同步工具,可用来进行多对多的镜像仓库同步,支持目前绝大多数主流的 docker 镜像仓库服务
English | 简体中文
可以使用 image-sync-action 这个 github action 来实现灵活触发的镜像同步作业(比如定时同步),不需要支付任何资源的同时,也可以解决国内外网访问的问题
在 releases 页面可下载源码以及二进制文件
go get github.com/AliyunContainerService/image-syncer
cd $GOPATH/github.com/AliyunContainerService/image-syncer
# This will create a binary file named image-syncer
make
# 获得帮助信息
./image-syncer -h
./image-syncer --proc=6 --auth=./auth.json --images=./images.json --auth=./auth.json --retries=3
为了提高配置的灵活性,image-syncer 支持通过 --auth
参数以文件的形式传入认证信息,同时通过 --images
参数以文件的形式传入镜像同步规则。两种配置文件都同时支持 YAML 和 JSON 两种格式,其中认证信息是可选的,镜像同步规则是必须的。通过两者分离的方式,可以做到认证信息的灵活复用
1.2.0 版本之前主要使用的、通过
--config
参数以一个配置文件同时传入认证信息和镜像同步规则的格式也是兼容的,可以参考 config.yaml 和 config.json
认证信息中可以同时描述多个 registry(或者 registry/namespace)对象,一个对象可以包含账号和密码,其中,密码可能是一个 TOKEN
注意,通常镜像源仓库需要具有 pull 以及访问 tags 权限,镜像目标仓库需要拥有 push 以及创建仓库权限;如果对应仓库没有提供认证信息,则默认匿名访问
认证信息文件通过 --auth
参数传入,具体文件样例可以参考 auth.yaml 和 auth.json,这里以 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
每条镜像同步规则为一个 “源镜像 url: 目标镜像 url” 的键值对。无论是源镜像 url 还是目标镜像 url,字符串格式都和 docker pull 命令所使用的镜像 url 大致相同(registry/repository:tag、registry/repository@digest),但在 tag 和 digest 配置上和 docker pull 所使用的 url 存在区别,这里对整体逻辑进行描述:
/
字符作为标识,源镜像 repository 中所有匹配正则表达式的镜像 tag 会被同步,不支持多个正则表达式镜像同步规则文件通过 --images
参数传入,具体文件样例可以参考 images.yaml 和 images.json,这里以 images.yaml 为例。 示例如下:
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 同步已经存在的、被忽略的镜像,这个操作会更新已存在镜像的时间戳
同步中常见的问题汇总在FAQs 文档中