如何编写脚本实现Docker镜像在跨云服务商仓库间的同步迁移?
- 内容介绍
- 文章标签
- 相关推荐
本文共计928个文字,预计阅读时间需要4分钟。
可以通过编写Shell脚本,结合使用`docker pull`、`docker tag`、`docker push`和镜像仓库认证机制,实现从本地拉取镜像、打标签、推送至镜像仓库。具体步骤如下:
准备跨仓库登录凭证与网络连通性
脚本运行环境需能同时访问源仓库和目标仓库。多数云厂商私有仓库要求通过 docker login 认证,且使用独立域名(如 registry.cn-hangzhou.aliyuncs.com)和账号体系。
- 在脚本开头或配置文件中预设源/目标仓库地址、命名空间(Namespace)、用户名/密码或临时 Token
- 推荐使用
docker login -u xxx -p yyy registry.example.com分别登录两个仓库;若用短期 STS Token(如阿里云 RAM Role 临时凭证),需在登录前动态获取并注入 - 确认服务器可解析并访问两个仓库域名(必要时配置 DNS 或 hosts,避免因内网/白名单限制导致 pull/push 失败)
构建镜像名映射与批量同步逻辑
不同云厂商仓库的镜像路径格式相似但不兼容,例如:
源:registry.cn-shanghai.aliyuncs.com/ns-a/nginx:1.22
目标:swr.cn-east-3.myhuaweicloud.com/ns-b/nginx:1.22
需将仓库地址、命名空间做字符串替换,并确保目标命名空间已存在(脚本中可调用对应云 CLI 自动创建)。
- 用数组或文本文件列出待迁移镜像全名(含 registry + ns + repo:tag),逐行读取
- 用
sed或 Bash 参数扩展提取原镜像名各段,生成目标镜像名,例如:target_img=$(echo "$src_img" | sed "s|registry.cn-shanghai.aliyuncs.com/ns-a|swr.cn-east-3.myhuaweicloud.com/ns-b|") - 对每个镜像执行三步:pull → tag → push,任一环节失败则记录日志并继续下一个
增强可靠性:添加重试、校验与并发控制
公网同步易受网络抖动影响,直接失败会导致迁移中断。加入基础容错可显著提升成功率。
- 为
docker pull和docker push添加重试逻辑(如最多 3 次,间隔 5 秒),用until或简单 for 循环实现 - push 完成后,用
curl -I或云厂商 CLI(如aliyun cr GetRepoImage/huaweicloud swr show-image)验证镜像是否真实存在于目标仓库 - 避免并发过多打爆本地磁盘或触发仓库限流,可用
sem(来自 GNU parallel)或简单计数器限制并发数(如最多 2 个镜像同时拉取)
封装为可复用脚本并支持参数化
把上述逻辑封装成带参数的 Bash 脚本,便于 CI/CD 集成或定时迁移。
- 支持命令行参数:--source-registry、--target-registry、--mapping-file(含源→目标映射规则)、--dry-run(仅打印不执行)
- 敏感信息(密码、Token)不硬编码,优先从环境变量(如
SRC_AUTH,TGT_AUTH)或临时文件读取,执行后自动清理 - 输出结构化日志(含时间戳、镜像名、状态、耗时),方便排查;失败项单独写入
failed.log
本文共计928个文字,预计阅读时间需要4分钟。
可以通过编写Shell脚本,结合使用`docker pull`、`docker tag`、`docker push`和镜像仓库认证机制,实现从本地拉取镜像、打标签、推送至镜像仓库。具体步骤如下:
准备跨仓库登录凭证与网络连通性
脚本运行环境需能同时访问源仓库和目标仓库。多数云厂商私有仓库要求通过 docker login 认证,且使用独立域名(如 registry.cn-hangzhou.aliyuncs.com)和账号体系。
- 在脚本开头或配置文件中预设源/目标仓库地址、命名空间(Namespace)、用户名/密码或临时 Token
- 推荐使用
docker login -u xxx -p yyy registry.example.com分别登录两个仓库;若用短期 STS Token(如阿里云 RAM Role 临时凭证),需在登录前动态获取并注入 - 确认服务器可解析并访问两个仓库域名(必要时配置 DNS 或 hosts,避免因内网/白名单限制导致 pull/push 失败)
构建镜像名映射与批量同步逻辑
不同云厂商仓库的镜像路径格式相似但不兼容,例如:
源:registry.cn-shanghai.aliyuncs.com/ns-a/nginx:1.22
目标:swr.cn-east-3.myhuaweicloud.com/ns-b/nginx:1.22
需将仓库地址、命名空间做字符串替换,并确保目标命名空间已存在(脚本中可调用对应云 CLI 自动创建)。
- 用数组或文本文件列出待迁移镜像全名(含 registry + ns + repo:tag),逐行读取
- 用
sed或 Bash 参数扩展提取原镜像名各段,生成目标镜像名,例如:target_img=$(echo "$src_img" | sed "s|registry.cn-shanghai.aliyuncs.com/ns-a|swr.cn-east-3.myhuaweicloud.com/ns-b|") - 对每个镜像执行三步:pull → tag → push,任一环节失败则记录日志并继续下一个
增强可靠性:添加重试、校验与并发控制
公网同步易受网络抖动影响,直接失败会导致迁移中断。加入基础容错可显著提升成功率。
- 为
docker pull和docker push添加重试逻辑(如最多 3 次,间隔 5 秒),用until或简单 for 循环实现 - push 完成后,用
curl -I或云厂商 CLI(如aliyun cr GetRepoImage/huaweicloud swr show-image)验证镜像是否真实存在于目标仓库 - 避免并发过多打爆本地磁盘或触发仓库限流,可用
sem(来自 GNU parallel)或简单计数器限制并发数(如最多 2 个镜像同时拉取)
封装为可复用脚本并支持参数化
把上述逻辑封装成带参数的 Bash 脚本,便于 CI/CD 集成或定时迁移。
- 支持命令行参数:--source-registry、--target-registry、--mapping-file(含源→目标映射规则)、--dry-run(仅打印不执行)
- 敏感信息(密码、Token)不硬编码,优先从环境变量(如
SRC_AUTH,TGT_AUTH)或临时文件读取,执行后自动清理 - 输出结构化日志(含时间戳、镜像名、状态、耗时),方便排查;失败项单独写入
failed.log

