使用 Skopeo 同步镜像到 5 朵云并校验摘要
解读
面试官想验证三件事:
- 你是否真正用过 Skopeo完成跨云搬运,而不是只会 docker pull/push;
- 对国内5 朵云(阿里云 ACR、腾讯云 TCR、华为云 SWR、百度云 CCR、天翼云 CT-CCR)的鉴权细节是否熟悉;
- 能否闭环校验摘要,保证镜像在公网传输、跨区域复制后 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 地域,并每日校验。脚本思路如下:
-
统一鉴权
用crane auth get或各云 CLI 提前刷新临时账号,写入${CLOUD}.json,例如:aliyun-cr-helper get-login-token | jq -r '.token' > aliyun.tok华为云需额外 export
SWR_DOMAINNAME=swr.${region}.myhuaweicloud.com。 -
并发同步
使用 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}失败日志落盘,便于后续重跑。
-
闭环校验
每朵云 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"若摘要不一致,触发回滚删除并告警。
-
审计与合规
所有操作写入 Kafka,由审计服务落 ES,字段包括 operator、src、dst、digest、耗时、状态,满足等保 2.0 三级要求。
该方案把单次全量同步时间从 4 h 降到 35 min,全年零数据不一致事故,并通过央行金融云验收。
拓展思考
- 如果 5 朵云之间需要双向同步(边缘云回传),可用 skopeo sync 加 YAML 声明文件,实现“主-主”模式,但要解决冲突写与循环复制问题,可引入 OCI Index 的 subject 字段做水印。
- 大规模场景下,skopeo copy 的瓶颈在层下载与上传串行;可改用 containerd+ctr-remote 利用 p2p 分发,或结合阿里云 ACR 的“全球同步”能力,把 skopeo 仅作为兜底校验工具。
- 国内部分地域要求镜像签名+验签(北京政务云),需在 copy 后使用 cosign attach signature,再执行 skopeo copy –preserve-digests –sign-by-sigstore,确保合规镜像不可抵赖。