skopeo同步镜像遇到的坑

sync.sh 脚本问题分析与解决方案文档

问题描述

在执行 bash sync.sh ghcr.io 10.7.20.12:5000 命令时,skopeo copy 命令报错 invalid reference format,错误信息显示镜像引用格式不正确,源镜像引用似乎被截断。

可能的原因

  1. 变量赋值问题:环境变量或者脚本参数没有正确赋值,导致镜像引用拼接出错。
  2. 空格或者换行问题:变量值中包含了多余的空格或者换行符,影响了镜像引用的格式。

解决方案

第一次尝试

skopeo_copy 函数调用前添加调试信息,打印出实际传递的参数,同时使用 printf 来确保变量值正确。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash
# ... existing code ...
for image in ${ALL_IMAGES}; do
  let CURRENT_NUM=${CURRENT_NUM}+1
  echo ${image}
  # 添加调试信息
  source_image="${SOURCE_REGISTRY}/${image}"
  target_image="${TARGET_REGISTRY}/${image}"
  echo "Source image: $source_image"
  echo "Target image: $target_image"
  skopeo_copy "$source_image" "$target_image"
done

image.png

第二次尝试

添加对 ALL_IMAGES 变量的清理操作,确保每个镜像名称不包含多余的字符。同时,使用 printf 来输出调试信息,避免潜在的换行问题。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# ... existing code ...
CURRENT_NUM=0
# 清理 ALL_IMAGES 中的多余字符
ALL_IMAGES=$(sed -n '/#/d;s/:/:/p' ${IMAGES_LIST_FILE} | sort -u | tr -d '\r')
TOTAL_NUMS=$(echo "${ALL_IMAGES}" | wc -l)
# ... existing code ...
skopeo_copy() {
  printf "skopeo copy --insecure-policy --src-tls-verify=false --dest-tls-verify=false \
       --override-arch amd64 --override-os linux -q docker://%s docker://%s\n" "$1" "$2"
  # ... existing code ...
}

for image in ${ALL_IMAGES}; do
  # ... existing code ...
  source_image="${SOURCE_REGISTRY}/${image}"
  target_image="${TARGET_REGISTRY}/${image}"
  echo "Source image: $source_image"
  echo "Target image: $target_image"
  skopeo_copy "$source_image" "$target_image"
done

image.png

总结

通过以上两次尝试,对 sync.sh 脚本进行了优化,添加了调试信息并清理了可能存在的多余字符,有助于定位和解决 skopeo copy 命令的镜像引用格式错误问题。你可以将修改后的脚本保存并重新运行,查看问题是否得到解决。

Licensed under CC BY-NC-SA 4.0
最后更新于 May 21, 2025 02:37 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up