一个基于 CNB 平台的 Docker 镜像同步工具,通过 Issue 提交镜像列表,自动将镜像同步到国内多个镜像仓库。
| 仓库 | 地址 |
|---|---|
| 腾讯云 | ccr.ccs.tencentyun.com |
| CNB Docker | docker.cnb.cool |
| 阿里云(北京) | registry.cn-beijing.aliyuncs.com |
| 阿里云(成都) | registry.cn-chengdu.aliyuncs.com |
| 阿里云(广州) | registry.cn-guangzhou.aliyuncs.com |
| 阿里云(杭州) | registry.cn-hangzhou.aliyuncs.com |
| 阿里云(河源) | registry.cn-heyuan.aliyuncs.com |
| 阿里云(呼和浩特) | registry.cn-huhehaote.aliyuncs.com |
| 阿里云(青岛) | registry.cn-qingdao.aliyuncs.com |
| 阿里云(上海) | registry.cn-shanghai.aliyuncs.com |
| 阿里云(深圳) | registry.cn-shenzhen.aliyuncs.com |
| 阿里云(乌兰察布) | registry.cn-wulanchabu.aliyuncs.com |
| 阿里云(张家口) | registry.cn-zhangjiakou.aliyuncs.com |
在本仓库创建 Issue,选择「镜像同步请求」模板,填写需要同步的镜像列表。
格式要求:
支持格式:
image:tag namespace/image:tag registry/namespace/image:tag registry/namespace/path/image:tag
示例:
nginx:1.21 redis:6.2 gcr.io/kubernetes/kube-proxy:v1.18.3 quay.io/prometheus/node-exporter:v1.3.0
同步成功后,Issue 评论中会包含镜像信息,可使用以下脚本拉取:
拉取到本地并恢复原始 tag:
img=$(cat dockerhub-image.yml)
for i in ${img[@]}; do
tagName=$(echo $i | awk -F "/" '{print $NF}');
docker pull $i;
sourceTag=$(cat images-init.yml | grep $tagName);
docker tag $i $sourceTag;
done
拉取并打包(用于离线环境):
img=$(cat dockerhub-image.yml)
for i in ${img[@]}; do
tagName=$(echo $i | awk -F "/" '{print $NF}');
filePrefix=$(echo $tagName | awk -F ":" '{print $1}');
fileSuffix=$(echo $tagName | awk -F ":" '{print $NF}');
fileName=$filePrefix--$fileSuffix.gz
docker pull $i;
mkdir localImage || echo 0
docker save $i -o localImage/$fileName
done
导入镜像包并上传到私有仓库:
img=$(ls localImage)
LOCAL_REGISTRY=your-registry.example.com
LOCAL_NAMESPACE=your-namespace
for i in ${img[@]}; do
docker load -i $i;
done
img=$(cat dockerhub-image.yml)
for i in ${img[@]}; do
tagName=$(echo $i | awk -F "/" '{print $NF}');
specialTag=$LOCAL_REGISTRY/$LOCAL_NAMESPACE/$tagName;
docker tag $i $specialTag;
docker push $specialTag;
done
. ├── .cnb.yml # CNB 工作流配置 ├── auth.yml # 目标仓库认证配置 ├── images.yml # 镜像映射配置(运行时生成) ├── script.md # 使用脚本说明 └── .cnb/ ├── ISSUE_TEMPLATE/ │ └── image-mirror.yml # Issue 模板 └── scripts/ ├── check_image_format.js # 镜像格式校验 ├── generate_images_yml.js # 生成同步配置 ├── create_issue_comment.js # 创建评论 ├── update_issue_comment.js # 更新评论 ├── update_issue_title.js # 更新标题 ├── set_issue_labels.js # 设置标签 └── find_issue_comment.js # 查找评论
需要配置以下环境变量(存储在 secret 中):
| 变量 | 说明 |
|---|---|
| CNB_TOKEN | CNB 平台 token |
| TARGET_REGISTRY | 目标镜像仓库地址 |
| TARGET_REGISTRY_USER | 目标仓库用户名 |
| TARGET_REGISTRY_PASSWORD | 目标仓库密码 |
| TARGET_NAMESPACE | 目标命名空间 |
MIT