logo
0
0
WeChat Login

CNB Docker 镜像搬运工具

基于 CNB 云原生构建 平台的 Docker 镜像同步/搬运工具,将外部 Registry(Docker Hub、GHCR 等)的镜像自动搬运到 CNB Docker 制品库。

功能特性

  • Skopeo 直传 — 直接在 Registry 间拷贝镜像,无需拉取到本地,不占用磁盘空间
  • 增量检测 — 通过 digest 比较判断镜像是否更新,未更新则跳过,节省资源
  • 多架构支持 — 支持 multi-arch 镜像(amd64/arm64 等)
  • 批量管理 — 在 images.yml 中配置清单,一键搬运所有镜像
  • 容错机制 — 单个镜像失败不影响其他镜像,最终汇总结果
  • 定时任务 — 支持每日定时执行,自动同步最新镜像

项目结构

. ├── .cnb.yml # CNB 工作流配置 ├── images.yml # 镜像搬运清单(编辑此文件添加镜像) ├── sync-skopeo.sh # Skopeo 搬运脚本(推荐) └── sync.sh # Docker 搬运脚本(备用)

快速开始

1. 配置镜像清单

编辑 images.yml,添加要搬运的镜像:

images: - src: louislam/uptime-kuma:latest - src: docker.io/library/node:20-alpine - src: ghcr.io/someuser/some-repo:v1.0 name: some-repo-v1 # 可选:自定义推送名称
字段说明
src源镜像地址(必填)
name推送到 CNB 的镜像名(可选,默认从 src 提取)

支持的源 Registry:

Registry示例
Docker Hubdocker.io/library/node:20-alpine 或简写 node:20-alpine
GitHub (GHCR)ghcr.io/owner/repo:tag
Google (GCR)gcr.io/project/image:tag
Quay.ioquay.io/org/image:tag
Microsoft (MCR)mcr.microsoft.com/dotnet/sdk:8.0

2. 推送到 CNB 制品库

推送目标地址由 CNB 平台自动拼接:

${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}/${IMAGE_NAME}

例如源镜像 louislam/uptime-kuma:latest 会推送到:

docker.cnb.cool/<你的仓库>/<你的项目>/uptime-kuma:latest

3. 运行工作流

在 CNB 平台手动触发工作流,或等待定时任务自动执行。

本地测试

# 模拟运行(只显示会搬运哪些镜像) ./sync-skopeo.sh --dry-run # 列出待搬运镜像 ./sync-skopeo.sh --list # 强制执行搬运(需要已安装 skopeo 和 yq) ./sync-skopeo.sh

工作原理

┌──────────────┐ skopeo copy ┌─────────────────────────┐ │ 外部 Registry │ ──────────────────→ │ CNB Docker 制品库 │ │ (Docker Hub) │ (直传, 不落盘) │ │ │ GHCR / GCR │ │ docker.cnb.cool/... │ └──────────────┘ └─────────────────────────┘ │ ▲ │ skopeo inspect --raw → digest 比较 │ │ │ └────────── digest 相同? ─── 是 ───────┘ 跳过搬运 ↓ 否 执行 skopeo copy

定时任务

.cnb.yml 中默认配置了每日凌晨 3 点的定时任务(需手动触发):

schedule: cron: "0 3 * * *" trigger: "manual"

如需改为自动触发,将 trigger 改为 auto 即可。

环境变量

CNB 平台运行时自动注入以下环境变量:

变量说明示例
CNB_DOCKER_REGISTRYCNB Registry 地址docker.cnb.cool
CNB_REPO_SLUG_LOWERCASE仓库路径(小写)user/project

常见问题

Q: 为什么选择 Skopeo 而不是 Docker pull/push?

A: Skopeo 直接在两个 Registry 之间传输数据,不需要本地 Docker daemon,不占用磁盘空间和带宽,速度更快。同时支持多架构镜像的一次性复制。

Q: digest 检测是什么?

A: 每次搬运前会比较源镜像和目标镜像的 SHA256 digest(内容哈希),如果相同说明没有更新,直接跳过。这避免了每次都重新拷贝整个镜像。

Q: 单个镜像搬运失败会影响其他镜像吗?

A: 不会。脚本会记录失败的镜像并继续搬运剩余镜像,最后汇总所有结果。

依赖工具

工具用途安装方式
skopeo镜像搬运核心工具apk add skopeo / apt install skopeo
yqYAML 解析从 GitHub Release 下载二进制

文档链接

About

搬运常用的docker镜像到cnb