logo
0
0
WeChat Login

Image Mirror

一个基于 CNB 平台的 Docker 镜像同步工具,通过 Issue 提交镜像列表,自动将镜像同步到国内多个镜像仓库。

功能特性

  • 支持 Docker Hub、GCR、Quay 等镜像源同步
  • 自动验证镜像格式
  • 一键同步到多个国内镜像仓库
  • 自动更新 Issue 状态和评论反馈
  • 提供镜像拉取和导入脚本

支持的目标仓库

仓库地址
腾讯云ccr.ccs.tencentyun.com
CNB Dockerdocker.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

使用方法

1. 创建同步请求

在本仓库创建 Issue,选择「镜像同步请求」模板,填写需要同步的镜像列表。

格式要求:

  • 每行一个镜像
  • 必须包含 tag
  • 不允许附加描述或注释

支持格式:

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

2. 自动同步流程

  1. 提交 Issue 后,工作流自动验证镜像格式
  2. 格式正确则自动开始同步
  3. 同步完成后更新 Issue 状态和评论

3. 拉取同步后的镜像

同步成功后,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      # 查找评论

技术栈

  • 平台: CNB (Code&Build)
  • 同步工具: image-syncer
  • 脚本: Node.js

配置要求

需要配置以下环境变量(存储在 secret 中):

变量说明
CNB_TOKENCNB 平台 token
TARGET_REGISTRY目标镜像仓库地址
TARGET_REGISTRY_USER目标仓库用户名
TARGET_REGISTRY_PASSWORD目标仓库密码
TARGET_NAMESPACE目标命名空间

License

MIT

About

No description, topics, or website provided.
Language
JavaScript100%