sync.sh
脚本问题分析与解决方案文档
问题描述
在执行 bash sync.sh ghcr.io 10.7.20.12:5000
命令时,skopeo copy
命令报错 invalid reference format
,错误信息显示镜像引用格式不正确,源镜像引用似乎被截断。
可能的原因
- 变量赋值问题:环境变量或者脚本参数没有正确赋值,导致镜像引用拼接出错。
- 空格或者换行问题:变量值中包含了多余的空格或者换行符,影响了镜像引用的格式。
解决方案
第一次尝试
在 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
|

第二次尝试
添加对 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
|

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