循环拉取Artifactory镜像执行Blackduck扫描报invalid reference format错误
故障排查与修复方案
根因定位
两类故障本质是脚本逻辑疏漏+输入内容不规范共同导致:
- 输入源逻辑矛盾:脚本开头定义了
input="dockerimagesURL.txt",但循环重定向用的是位置参数$1,执行脚本时如果没传文件路径参数,$1为空值,while循环不会读取你准备好的镜像列表文件,要么读取终端输入要么传入空字符串给docker命令,直接触发invalid reference format错误,自然也不会执行预期的镜像拉取操作。 - 输入文件格式兼容问题:如果镜像列表文件是在Windows系统下编辑保存的,每行末尾会带不可见的
\r回车字符,拼接到镜像地址里会被docker识别为非法字符,同样触发格式错误;如果文件最后一行没有换行符,默认的read命令会漏掉最后一行镜像地址。 - 流程逻辑缺漏:没有判断
docker pull的执行结果,一旦拉取失败(私有仓库未登录、网络不通、镜像tag不存在),后续获取镜像ID、执行扫描的步骤依然会运行,触发连锁报错。 - 命令参数错误:贴出的扫描命令片段里
-- scan中间存在冗余空格,会导致Synopsys Detect参数解析失败。 - 解释器兼容性问题:脚本开头用
#!/usr/bin/sh,部分发行版的sh链接到dash,对部分shell语法支持不完善,容易触发非预期错误。
修复操作
- 统一输入文件逻辑:优先读取执行脚本时传入的文件路径参数,未传参时默认读取
dockerimagesURL.txt,增加文件存在性校验。 - 优化行读取逻辑:读取时禁用自动转义、保留行原始内容,兼容文件末尾无换行的场景,读取后统一清洗行尾
\r字符、首尾空白字符,自动跳过空行。 - 增加执行状态校验:每个步骤执行失败时打印错误日志,跳过当前镜像的后续流程,避免无效执行。
- 修正扫描命令参数格式,删除
--后多余的空格,正确传入镜像参数给Blackduck扫描工具。 - 执行脚本前先完成Artifactory私有仓库的docker登录,避免因鉴权失败导致拉取镜像失败。
修复后完整脚本
#!/bin/bash # 优先使用传入的第一个参数作为镜像列表,未传参则使用默认文件 if [ -n "$1" ]; then input="$1" else input="dockerimagesURL.txt" fi # 校验镜像列表文件是否存在 if [ ! -f "$input" ]; then echo "错误:镜像列表文件 $input 不存在,请检查路径" exit 1 fi # 逐行读取镜像地址,兼容最后一行无换行、特殊字符转义场景 while IFS= read -r raw_line || [ -n "$raw_line" ] do # 清洗行内容:删除Windows回车符、首尾空白,空行直接跳过 dockerimagesURL=$(echo "$raw_line" | tr -d '\r' | xargs) if [ -z "$dockerimagesURL" ]; then continue fi echo "正在处理镜像:$dockerimagesURL" # 拉取镜像,失败则跳过后续扫描流程 if ! docker pull "$dockerimagesURL"; then echo "错误:镜像 $dockerimagesURL 拉取失败,跳过扫描" continue fi # 获取镜像ID DockerImageID=$(docker images "$dockerimagesURL" --format '{{.ID}}') if [ -z "$DockerImageID" ]; then echo "错误:无法获取镜像 $dockerimagesURL 的ID,跳过扫描" continue fi echo "镜像拉取成功,对应ID:$DockerImageID,启动Blackduck扫描" # 执行Blackduck扫描,注意删除--后多余空格,按实际需求补全剩余扫描参数 sudo -S java -jar /home/dxc/Desktop/synopsis-detect-7.11.0/synopsys-detect-7.11.0.jar \ --detect.docker.image="$dockerimagesURL" # 其余原有扫描参数按顺序追加在此处即可 done < "$input"
隐藏问题排查
如果修改脚本后依然报格式错误,执行以下命令检查镜像列表文件是否存在非法隐藏字符:
cat -A dockerimagesURL.txt
正常行结尾只会显示$,如果出现^M$标记说明是Windows格式换行,执行以下命令批量清理回车符即可:
sed -i 's/\r//g' dockerimagesURL.txt
内容的提问来源于stack exchange,提问作者Santoshkumar
相关产品推荐
相关产品推荐

