使用 Skopeo 同步镜像到 5 朵云并校验摘要

解读

面试官想验证三件事:

  1. 你是否真正用过 Skopeo完成跨云搬运,而不是只会 docker pull/push;
  2. 对国内5 朵云(阿里云 ACR、腾讯云 TCR、华为云 SWR、百度云 CCR、天翼云 CT-CCR)的鉴权细节是否熟悉;
  3. 能否闭环校验摘要,保证镜像在公网传输、跨区域复制后 100 % 一致,规避“看起来成功实则层被篡改”的风险。

回答时要体现脚本级自动化、失败重试、并发限速、合规审计等生产要素,否则会被认为只能做 Demo。

知识点

  • Skopeo 原生命令:copy、sync、manifest-digest、inspect
  • 国内云厂商临时凭证刷新机制:阿里云 ACR 的 Token 15 min 失效、华为云 SWR 的 AK/SK 需配合 project-id、天翼云需先获取登录密钥串
  • 摘要算法:Docker-Content-Digest 头对应的 SHA256;校验时必须用 –remove-signatures 或 –preserve-digests 避免清单重写
  • 并发限速:–src-registry-token + –dest-registry-token 与 –dest-compress=false 组合,防止跨洋链路打满带宽
  • 失败重试:copy 失败返回码 1,需识别 401/403/429 并刷新凭证
  • 审计闭环:copy 后执行 skopeo inspect –raw,比对 digest 与源清单;同时写入国内等保要求的操作日志(who、when、src、dst、digest)

答案

我曾在某互金公司负责“灾备双活”项目,需把 200 个核心业务镜像从自建 Harbor 同步到5 朵云 8 地域,并每日校验。脚本思路如下:

  1. 统一鉴权
    crane auth get 或各云 CLI 提前刷新临时账号,写入 ${CLOUD}.json,例如:

    aliyun-cr-helper get-login-token | jq -r '.token' > aliyun.tok
    

    华为云需额外 export SWR_DOMAINNAME=swr.${region}.myhuaweicloud.com

  2. 并发同步
    使用 GNU parallel 调用 skopeo copy,限速 50 M:

    skopeo copy --src-tls-verify=true \
                --dest-tls-verify=true \
                --dest-compress=false \
                --retry-times=3 \
                --retry-delay=5s \
                docker://${SRC_HARBOR}/${repo}:${tag} \
                docker://${DST_ACR}/${repo}:${tag}
    

    失败日志落盘,便于后续重跑。

  3. 闭环校验
    每朵云 copy 完成后立即:

    src_digest=$(skopeo inspect --raw docker://${SRC_HARBOR}/${repo}:${tag} | sha256sum | cut -d' ' -f1)
    dst_digest=$(skopeo inspect --raw docker://${DST_ACR}/${repo}:${tag} | sha256sum | cut -d' ' -f1)
    [[ "$src_digest" == "$dst_digest" ]] && echo "OK" || echo "FAIL"
    

    若摘要不一致,触发回滚删除并告警。

  4. 审计与合规
    所有操作写入 Kafka,由审计服务落 ES,字段包括 operator、src、dst、digest、耗时、状态,满足等保 2.0 三级要求。

该方案把单次全量同步时间从 4 h 降到 35 min,全年零数据不一致事故,并通过央行金融云验收

拓展思考

  1. 如果 5 朵云之间需要双向同步(边缘云回传),可用 skopeo sync 加 YAML 声明文件,实现“主-主”模式,但要解决冲突写循环复制问题,可引入 OCI Index 的 subject 字段做水印。
  2. 大规模场景下,skopeo copy 的瓶颈在层下载与上传串行;可改用 containerd+ctr-remote 利用 p2p 分发,或结合阿里云 ACR 的“全球同步”能力,把 skopeo 仅作为兜底校验工具。
  3. 国内部分地域要求镜像签名+验签(北京政务云),需在 copy 后使用 cosign attach signature,再执行 skopeo copy –preserve-digests –sign-by-sigstore,确保合规镜像不可抵赖