如何在jq中检查Docker镜像标签列表是否存在精确匹配?
检查Docker Registry镜像仓库中是否存在指定标签
场景说明
通过curl请求Docker Registry的标签列表接口:
curl http://my-registry-ip-address/v2/ancean-api/tags/list
返回JSON数据:
{"name":"ancean-api","tags":["v1.0.0","v19.0.0","v11.1.1"]}
需要判断该仓库中是否存在特定标签(如v1.0.0)。
之前尝试的错误方法及问题
错误的jq select用法
执行命令:curl http://my-registry-ip-address/v2/ancean-api/tags/list | jq '.tags | select(. == v1.0.19)'问题:
.tags是数组类型,直接和单个值比较逻辑不成立;同时v1.0.19未加双引号,jq会将其视为未定义变量,导致判断逻辑混乱,出现无论输入什么标签都返回结果的异常。jq结合grep的错误用法
执行命令:curl http://my-registry-ip-address/v2/ancean-api/tags/list | jq '.tags | .[]' | grep "v1.0.0"问题:
jq '.tags | .[]'输出的每个标签都带双引号(例如"v1.0.0"),而grep搜索的是不带引号的字符串,因此无法匹配到目标内容。
正确解决方案:使用jq的IN函数
利用jq的IN()函数可以直接判断指定值是否存在于数组中,返回布尔值(true表示存在,false表示不存在):
curl http://my-registry-ip-address/v2/ancean-api/tags/list | jq 'IN(.tags[]; "v1.0.0")'
该命令会遍历.tags数组的所有元素,检查是否有元素等于"v1.0.0",最终返回对应的布尔结果。
内容的提问来源于stack exchange,提问作者Antoliny Lee
相关产品推荐
相关产品推荐

