logo
0
0
WeChat Login
Forkfromxqitw/docker, behind:main4 commits

Docker 镜像同步工具

badge badge badge badge

这是一个基于 Skopeo 的 Docker 镜像多架构同步工具,使用 Python 编写,支持将外部 Docker 镜像同步到 CNB 私有仓库,并自动处理多架构镜像。

功能特性

  • 🔄 使用 Skopeo 实现高效的镜像跨仓库同步
  • 🏗️ 支持多架构镜像同步(amd64、arm64 等)
  • 🔍 自动检测源镜像支持的平台架构
  • ✅ 智能架构验证和过滤
  • 🚀 自动创建和管理 manifest list
  • 🏷️ 智能处理镜像名称和版本标签
  • 📦 支持自定义架构列表和额外架构配置
  • 🔄 自动重试机制(最多 6 次)
  • 📝 详细的日志输出和错误处理

项目结构

. ├── main.py # 主程序入口 ├── skopeo_client.py # Skopeo 客户端封装类 ├── pyproject.toml # Python 项目配置 └── README.md # 项目说明文档

核心组件

SkopeoClient

SkopeoClient 是核心的镜像同步客户端,封装了所有与 Skopeo 相关的操作:

  • login() - 登录镜像仓库
  • copy_image_by_archs() - 按指定架构复制镜像
  • create_and_push_manifest() - 创建并推送 manifest list
  • get_img_platform_info() - 获取镜像支持的平台架构
  • parse_image_info() - 解析镜像名称和版本
  • format_manifests_arch() - 格式化架构信息

使用方法

环境变量

工具依赖以下环境变量:

变量名必需说明
DOCKER_DELETE_CNB_TOKEN自定义 CNB Token,支持删除操作
CNB_TOKEN备用认证 Token(默认不支持删除操作)
CNB_DOCKER_REGISTRYCNB Docker 仓库地址
CNB_REPO_SLUG_LOWERCASE项目标识符
DOCKER_FULL_IMAGE要同步的源镜像地址
DOCKER_ARCHS要同步的架构列表(逗号分隔)
DOCKER_ARCHS_MORE额外的架构列表(空格分隔)
SKIP_ARCH_CHECK是否跳过架构检查(默认 true)

运行方式

通过 Python 直接运行

# 设置环境变量 export DOCKER_FULL_IMAGE="nginx:1.21" export CNB_DOCKER_REGISTRY="docker.cnb.cool" export CNB_REPO_SLUG_LOWERCASE="my-project" export CNB_TOKEN="your-token" export DOCKER_ARCHS="linux/amd64,linux/arm64" # 运行程序 python main.py

通过 Web 界面触发

在 CNB 平台的项目页面,通过 Web 触发器配置环境变量并执行同步操作。

架构格式

支持的架构格式:

  • linux/amd64 - 操作系统/架构
  • linux/arm64/v8 - 操作系统/架构/变体
  • amd64 - 仅架构(使用默认操作系统)

工作流程

工具执行以下步骤:

  1. 环境准备

    • 从环境变量读取配置信息
    • 解构架构列表(合并 DOCKER_ARCHSDOCKER_ARCHS_MORE
  2. 初始化客户端

    • 实例化 SkopeoClient
    • 执行仓库登录
  3. 架构验证

    • 使用 Skopeo 检查源镜像支持的平台架构
    • 根据 SKIP_ARCH_CHECK 配置进行架构过滤或严格验证
  4. 镜像解析

    • 解析源镜像的名称和版本标签
    • 构建 CNB 目标镜像地址
  5. 镜像复制

    • 按架构逐个复制镜像到 CNB 仓库
    • 为每个架构生成独立的镜像标签(如:myimage:1.21-linux_amd64
  6. 等待推送完成

    • 等待 10 秒确保所有架构镜像推送成功
  7. 创建 Manifest

    • 使用 Docker 命令创建 manifest list
    • 将所有架构镜像添加到 manifest
    • 推送 manifest 到 CNB 仓库

代码示例

使用 SkopeoClient

from skopeo_client import SkopeoClient # 实例化客户端 client = SkopeoClient( token="your-token", registry="docker.cnb.cool", username="cnb" ) # 登录仓库 client.login() # 获取镜像支持的架构 archs = client.get_img_platform_info("nginx:1.21") print(f"支持的架构: {archs}") # 按架构复制镜像 client.copy_image_by_archs( source="nginx:1.21", destination="docker.cnb.cool/my-project/nginx:1.21", archs=["linux/amd64", "linux/arm64"] ) # 创建并推送 manifest client.create_and_push_manifest( manifest_name="docker.cnb.cool/my-project/nginx:1.21", imgs=[ "docker.cnb.cool/my-project/nginx:1.21-linux_amd64", "docker.cnb.cool/my-project/nginx:1.21-linux_arm64" ] )

输出示例

获取镜像支持的架构: ['linux/amd64', 'linux/arm64', 'linux/arm/v7'] 筛选后的架构: ['linux/amd64', 'linux/arm64'] 镜像名称: nginx 镜像版本: 1.21 目标镜像: docker.cnb.cool/my-project/nginx:1.21 复制镜像中... 添加镜像:docker manifest create docker.cnb.cool/my-project/nginx:1.21 --amend docker.cnb.cool/my-project/nginx:1.21-linux_amd64 --amend docker.cnb.cool/my-project/nginx:1.21-linux_arm64 推送镜像:docker manifest push docker.cnb.cool/my-project/nginx:1.21 等待镜像推送完成...

错误处理

工具包含完善的错误处理机制:

  • 环境变量未设置时会提示具体缺失的变量
  • Skopeo 或 Docker 命令执行失败时会显示详细的错误信息
  • 架构验证失败时会列出支持的架构和请求的架构
  • 每个步骤都有独立的错误检查和退出机制

依赖要求

系统依赖

  • Python >= 3.14
  • Skopeo - 镜像同步工具
  • Docker - 用于 manifest 管理

安装 Skopeo

# Ubuntu/Debian sudo apt-get install skopeo # CentOS/RHEL sudo yum install skopeo # macOS brew install skopeo

安装 Docker

# Ubuntu/Debian curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # macOS brew install --cask docker

配置文件

  • pyproject.toml - Python 项目配置和依赖管理
  • .cnb.yml - CNB 平台的 CI/CD 配置文件
  • .cnb/web_trigger.yml - CNB 平台的 Web 触发器配置

注意事项

  • 确保目标镜像在源仓库中存在
  • 需要有足够的权限访问 CNB Docker 仓库
  • 大型镜像同步可能需要较长时间
  • 建议在非高峰时段进行大量镜像同步
  • SKIP_ARCH_CHECK=true 时,只会同步源镜像支持的架构
  • 复制过程中会自动重试(最多 6 次)

许可证

本项目采用 MIT 许可证。

About

一个用于将外部 Docker 镜像同步到 CNB 仓库的自动化工具