Azure ACR批量获取仓库及镜像脚本报错,单独执行命令正常
问题分析与解决方案
核心原因
你遇到的错误是因为ACR中部分仓库没有任何镜像标签,当执行az acr repository show-tags命令查询空仓库时,Azure CLI会返回ERROR: The requested data does not exist的错误。而你单独执行命令时,可能只测试了包含标签的仓库,所以没有触发这个问题。
脚本的潜在语法/写法问题
虽然核心原因是空仓库,但你的脚本存在几个可以优化的地方,避免类似问题并提升鲁棒性:
- 变量扩展时未加双引号:若仓库名包含特殊字符(ACR中虽不常见,但语法上应防范),会导致命令执行异常。
- 使用
for循环遍历命令输出:若输出包含换行或意外空白,可能导致错误的遍历行为,推荐用while read更可靠。 - 未处理命令执行失败的情况:空仓库的错误会直接输出到终端,影响脚本的整洁性。
修复后的脚本
#!/bin/bash registry_name='REGISTRY_NAME' destination='LOCATION_TO_STORE_LIST' # 登录ACR并检查登录状态 if ! az acr login --name "$registry_name"; then echo "登录ACR失败: $registry_name" >&2 exit 1 fi # 清空目标文件(若存在)或创建新文件 > "$destination" # 遍历所有仓库(使用while read确保每行一个仓库) az acr repository list -n "$registry_name" --output tsv | while read -r repo; do # 查询仓库标签,将错误输出重定向到/dev/null以屏蔽空仓库的错误 az acr repository show-tags -n "$registry_name" --repository "$repo" --output tsv --orderby time_desc 2>/dev/null | while read -r tag; do echo "$repo:$tag" >> "$destination" done done
关键优化点
- 双引号包裹变量:所有变量扩展都用
"$variable"形式,避免意外的单词拆分或字符解析问题。 while read遍历输出:确保每行内容被正确识别为一个仓库/标签,不受空白字符影响。- 错误屏蔽:将
show-tags的错误输出重定向到/dev/null,避免空仓库的错误信息干扰结果。 - 登录状态检查:如果ACR登录失败,脚本直接退出并提示错误,避免后续无效执行。
内容的提问来源于stack exchange,提问作者JRDigital
相关产品推荐
相关产品推荐

