基于 CNB 云原生构建 平台的 Docker 镜像同步/搬运工具,将外部 Registry(Docker Hub、GHCR 等)的镜像自动搬运到 CNB Docker 制品库。
images.yml 中配置清单,一键搬运所有镜像. ├── .cnb.yml # CNB 工作流配置 ├── images.yml # 镜像搬运清单(编辑此文件添加镜像) ├── sync-skopeo.sh # Skopeo 搬运脚本(推荐) └── sync.sh # Docker 搬运脚本(备用)
编辑 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 Hub | docker.io/library/node:20-alpine 或简写 node:20-alpine |
| GitHub (GHCR) | ghcr.io/owner/repo:tag |
| Google (GCR) | gcr.io/project/image:tag |
| Quay.io | quay.io/org/image:tag |
| Microsoft (MCR) | mcr.microsoft.com/dotnet/sdk:8.0 |
推送目标地址由 CNB 平台自动拼接:
${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}/${IMAGE_NAME}
例如源镜像 louislam/uptime-kuma:latest 会推送到:
docker.cnb.cool/<你的仓库>/<你的项目>/uptime-kuma:latest
在 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_REGISTRY | CNB 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 |
| yq | YAML 解析 | 从 GitHub Release 下载二进制 |