{"id":20982989,"url":"https://github.com/tkestack/image-transfer","last_synced_at":"2025-04-07T11:05:25.715Z","repository":{"id":47060282,"uuid":"322206649","full_name":"tkestack/image-transfer","owner":"tkestack","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-26T02:34:05.000Z","size":1329,"stargazers_count":76,"open_issues_count":4,"forks_count":26,"subscribers_count":14,"default_branch":"main","last_synced_at":"2025-03-31T10:05:52.742Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tkestack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-17T06:50:59.000Z","updated_at":"2025-03-22T02:09:36.000Z","dependencies_parsed_at":"2024-06-18T22:39:15.237Z","dependency_job_id":"45003c57-5b52-46f0-b52b-6e710130be43","html_url":"https://github.com/tkestack/image-transfer","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkestack%2Fimage-transfer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkestack%2Fimage-transfer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkestack%2Fimage-transfer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkestack%2Fimage-transfer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tkestack","download_url":"https://codeload.github.com/tkestack/image-transfer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247640462,"owners_count":20971557,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-19T05:47:21.141Z","updated_at":"2025-04-07T11:05:25.676Z","avatar_url":"https://github.com/tkestack.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 镜像迁移工具：image-transfer\n\n`image-transfer` 是一个docker镜像迁移工具，用于对不同镜像仓库的镜像进行批量迁移。\n\n## 特性\n\n- 支持多对多镜像仓库迁移\n- 支持腾讯云 TCR 个人版(CCR)一键全量迁移至企业版\n- 支持基于 Docker Registry V2搭建的docker镜像仓库服务 (如 腾讯云TCR个人版(CCR)/TCR企业版、Docker Hub、 Quay、 阿里云镜像服务ACR、 Harbor等)\n- 支持自定义 qps 限速，避免迁移时对仓库造成过大压力\n- 同步不落盘，提升同步速度\n- 利用 pipeline 模型，提高任务执行效率\n- 增量同步, 通过对同步过的镜像 blob 信息落盘，不重复同步已同步的镜像\n- 并发同步，可以通过配置文件调整并发数\n- 自动重试失败的同步任务，可以解决大部分镜像同步中的网络抖动问题\n- 不依赖docker以及其他程序\n\n## 模式\n\ntcr镜像迁移工具具有两种运行模式：\n\n- 通用模式：支持多种镜像仓库迁移\n- 腾讯云 CCR 一键全量迁移模式：腾讯云 TCR 个人版(CCR) -\u003e TCR企业版\n\n## 架构\n\n![image](./docs/arch.png)\n\n## 使用\n\n### 下载和安装\n\n在[releases](https://github.com/tkestack/image-transfer/releases)页面可下载源码以及二进制文件\n\n### 手动编译\n\n```bash\ngit clone https://github.com/tkestack/image-transfer.git\ncd ./image-transfer\n\n# 编译\nmake\n```\n\n## 使用方法\n\n### 使用帮助\n\n```shell\n./image-transfer -h\n```\n\n### 使用示例1：通用模式\n\n设置镜像鉴权配置文件为 registry-secret.yaml，镜像迁移仓库规则文件为 transfer-rule.yaml，默认迁移目标为腾讯云 TCR 个人版：ccr.ccs.tencentyun.com，默认 namespace 为 default，并发数为 5，\n\n```shell\n./image-transfer --securityFile=./registry-secret.yaml --ruleFile=./transfer-rule.yaml \\  \n--ns=default --registry=ccr.ccs.tencentyun.com --routines=5 --retry=3\n```\n\n### 使用示例2：腾讯云 CCR 一键全量迁移模式\n\n打开ccr迁移模式 ccrToTcr=true, 设置镜像仓库鉴权配置文件为 registry-secret.yaml，腾讯云 API 调用密钥配置文件为 tencentcloud-secret.yaml，默认个人版及企业版实例所在地域均为 ap-guangzhou（广州）\nTCR 企业版实例示例名称为 image-transfer, 并发数为 5，失败重试次数为 3\n\n```shell\n./image-transfer --ccrToTcr=true --securityFile=./registry-secret.yaml --secretFile=./tencentcloud-secret.yaml \\ \n--tcrName=image-transfer --tcrRegion=ap-guangzhou --ccrRegion=ap-guangzhou --routines=5 --retry=3\n```\n\n### 配置文件参考\n\n#### 腾讯云 API 密钥配置文件 tencentcloud-secret.yaml\n\n如需迁移至腾讯云容器镜像服务内，需配置腾讯云 API 调用密钥，可前往 控制台-访问管理-访问密钥-API密钥管理 获取密钥对。如果在同账号下将 TCR 个人版数据迁移至企业版实例内，可共用同一套密钥。\n\n```yaml\nccr:\n    secretId: xxx\n    secretKey: xxx\ntcr:\n    secretId: xxx\n    secretKey: xxx\n```\n\n#### 镜像仓库鉴权配置文件 registry-secret.yaml\n\n配置源目标及迁移目标镜像仓库的访问凭证，即 Docker Login 所使用的用户名，密码。\n\n```yaml\nccr.ccs.tencentyun.com:\n  username: xxx\n  password: xxx\nimage-transfer.tencentcloudcr.com:\n  username: xxx\n  password: xxx\nregistry.hub.docker.com:\n  username: xxx\n  password: xxx\nregistry.cn-guangzhou.aliyuncs.com:\n  username: xxx\n  password: xxx\nacr.cn-guangzhou.cr.aliyuncs.com:\n  username: xxx\n  password: xxx\n```\n\n#### 镜像迁移仓库配置文件 transfer-rule.yaml\n\n配置镜像迁移规则，即镜像仓库，镜像版本在源目标及迁移目标内的映射关系。\n\n注：目前只支持 repo、tag 级别，且可同时配置多条镜像迁移规则。\n\n```yaml\n## tag\ndemo-ns/nginx:latest : image-transfer.tencentcloudcr.com/demo-ns/nginx:latest\n## repo\nregistry.hub.docker.com/{ns1}/{repo1}: image-transfer.tencentcloudcr.com/{ns1}/{repo1}\nregistry.hub.docker.com/{ns2}/{repo2}: image-transfer.tencentcloudcr.com/{ns2}/{repo2}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftkestack%2Fimage-transfer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftkestack%2Fimage-transfer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftkestack%2Fimage-transfer/lists"}