skopeo 是轻量安全的容器镜像操作工具,支持跨仓库同步,需正确配置传输协议前缀、显式认证及优化参数如 --all 和 --retry-times。

Skopeo 是一个轻量、安全的容器镜像操作工具,不依赖 Docker 守护进程,特别适合在无 Docker 环境(如 CI/CD 构建节点、最小化系统)中完成镜像复制、校验与同步。跨仓库镜像同步的核心在于 skopeo copy 命令的灵活配置,关键不在“能不能”,而在“怎么配得准、传得稳、控得细”。
支持的源和目标仓库类型要先确认清楚
Skopeo 支持多种传输协议,不同仓库需用对应前缀标识:
-
Docker Hub / 私有 Registry v2:用
docker://,例如docker://nginx:alpine -
OCI 格式目录(本地存储):用
dir:/path/to/dir,适合中转或离线场景 -
OCI 存档(tar 包):用
oci-archive:/path/to/image.tar,便于打包分发 -
Quay、GitHub Container Registry(GHCR)、阿里云 ACR、腾讯云 TCR 等:统一使用
docker://<registry-host>/<ns>/<repo>:<tag></tag></repo></ns></registry-host>,但需提前配置认证
跨仓库同步必须处理好身份认证
多数私有仓库或带权限的公有仓库(如 GHCR、ACR)要求登录。Skopeo 不复用 docker login 凭据,需显式提供:
- 用
--src-creds和--dest-creds分别传入源/目标仓库用户名密码(明文慎用,建议配合环境变量) - 更安全的方式是使用
--src-authfile和--dest-authfile指向~/.docker/config.json或自定义 auth 文件(格式相同) - 若目标仓库支持 token(如 GitHub 的
ghp_***),可将 token 当作密码使用:--dest-creds=USERNAME:ghp_abc123
同步过程要兼顾效率与可控性
默认 skopeo copy 会拉取并推送所有层,但可通过参数优化行为:
-
--all:同步多架构镜像(manifest list),比如同时传amd64和arm64变体 -
--preserve-manifest-lists:保持原始 manifest list 结构,避免只同步单个平台镜像而破坏 multi-arch 兼容性 -
--remove-signatures:跳过签名校验,适用于不启用 cosign 或 notary 的内部环境,加快同步 -
--retry-times 3:网络不稳定时自动重试,避免因临时超时中断
实用同步命令示例(含错误预防)
以“将 GitHub Container Registry 的镜像同步到阿里云 ACR”为例:
skopeo copy \ --src-authfile ~/.config/ghcr-auth.json \ --dest-authfile ~/.config/acr-auth.json \ --all \ --preserve-manifest-lists \ --retry-times 3 \ docker://ghcr.io/your-org/app:v1.2.0 \ docker://registry.cn-hangzhou.aliyuncs.com/your-ns/app:v1.2.0
执行前建议先用 skopeo inspect 查看源镜像结构,确认是否为 manifest list;同步后可用 skopeo list-tags 验证目标仓库是否已写入。若遇 401/403 错误,优先检查 auth 文件中 registry 地址是否与 skopeo copy 中的 host 完全一致(如 ghcr.io ≠ https://ghcr.io)。











