skopeo copy 命令可直接跨仓库搬运镜像,无需拉取到本地、不占磁盘空间、不依赖 docker 守护进程;需确保源和目标地址均带 docker:// 等明确协议前缀,支持认证复用、证书配置及自动化批量操作。

直接用 skopeo copy 命令就能在不拉取镜像到本地磁盘的前提下,完成跨仓库的镜像搬运。整个过程只传输元数据和层数据流,不落地、不占空间、不依赖 Docker 守护进程。
确保镜像地址格式正确
Skopeo 要求所有远程镜像地址必须带明确协议前缀,否则会报 “unsupported transport” 错误:
- 官方 Docker Hub 镜像:用
docker://docker.io/library/nginx:alpine - 私有 Harbor/Quay:用
docker://harbor.example.com/project/app:v1.2 - Kubernetes 官方镜像(如 pause):用
docker://registry.k8s.io/pause:3.9 - 阿里云 ACR 或腾讯云 TCR:同样需加
docker://前缀,例如docker://cr.cn-hangzhou.aliyuncs.com/my-ns/my-app:latest
执行免下载镜像复制
命令结构简洁,源和目标都支持不同仓库类型(docker://、oci://、dir: 等),典型用法:
- 从 Docker Hub 搬到私有 Harbor:
skopeo copy docker://docker.io/library/redis:7.2 docker://harbor.internal/infra/redis:7.2 - 两个私有仓库间直传(跳过中转):
skopeo copy docker://reg-a.example.com/app:prod docker://reg-b.example.com/app:prod-mirror - 同步时自动添加后缀标识来源:
skopeo copy --append-suffix '-harbor-sync' docker://nginx:1.25 docker://harbor.internal/web/nginx:1.25
处理认证与证书
Skopeo 自动复用已有的凭据配置,无需重复登录:
- 若已用
podman login或docker login登录过对应仓库,它会读取~/.docker/config.json或$XDG_RUNTIME_DIR/containers/auth.json - 临时传凭据(适合脚本):
skopeo copy --creds admin:Abc123! docker://... docker://... - 自签名证书环境(仅测试):
--tls-verify=false;生产环境建议将 CA 证书加入系统信任链或通过--cert-dir指定路径
集成到自动化流程
配合 Shell 脚本或 Ansible 可实现批量迁移:
- Shell 批量搬运(示例):
for img in nginx:alpine redis:7.2 busybox:glibc; do skopeo copy "docker://docker.io/library/$img" "docker://harbor.internal/mirror/$img"; done - Ansible 中调用(无额外模块依赖):
- name: 同步基础镜像 command: skopeo copy {{ item.src }} {{ item.dest }} loop: [ { src: 'docker://alpine:3.20', dest: 'docker://harbor.internal/base/alpine:3.20' } ] - 加超时和重试保障稳定性:
skopeo copy --command-timeout 300s --retry-times 3 ...
不复杂但容易忽略:只要地址带 docker://、网络通、权限够,一条 copy 命令就完成跨仓库搬运,全程无本地镜像解压或存储开销。











