使用shell脚本检查docker注册表中是否存在图像的标记



在给定的images.json文件中,我有一个图像及其相应标签的列表,如下所示:

{
"image1":"1.1",
"image2": "1.2",
"image3": "1.3"
}

我能够使用sed命令从上面的images.json读取值,并将每列存储在一个数组中,例如

image=${arraydata[0]}
tag=${arraydata[1]}

对于每个图像,我想比较一下它的标签是否存在于我从curl命令获得的以下输出中:

curl -X GET https://docker.jfrog.io/artifactory/api/docker/docker-local/v2/$image/tags/list?

以上输出:

{
"name" : "image1",
"tags" : [ "1.1", "1.2" ]
}{
"name" : "image2",
"tags" : [ "1.1", "1.2", "1.3" ]
}{
"name" : "image3",
"tags" : [ "1.1", "1.2", "1.4" ]
}

我想有一个if/else语句来检查上面的结果中是否存在图像的标签:

  • 如果存在,则不执行任何操作
  • 否则执行docker push jfrog/$image:$tag

也许(未经测试(

  • 假设您的shell是bash
  • 使用jq满足JSON解析需求
declare -A versions
while IFS=$'t' read -r img ver; do
versions[$img]=$ver
done < <(
jq -r '. as $obj | keys[] | [., $obj[.]] | @tsv' images.json
)
# versions=([image1]="1.1" [image2]="1.2" [image3]="1.3" )
for img in "${!versions[@]}"; do
ver=${versions[$img]}
url="https://docker.jfrog.io/artifactory/api/docker/docker-local/v2/$img/tags/list?"
artifacts=$(curl -X GET "$url")
result=$(jq --arg ver "$ver" '.tags | contains([$ver])' <<<"$artifacts")
if [[ $result == true ]]; then
echo "image $img has version $ver"
else
echo "image $img does not have version $ver"
fi
done
status=$(wget --spider --server-response http://any_url:5000/v2/repository/image-name-you-query/manifests/latests 2>&1 | grep "HTTP/" | awk '{print $2}')

如果图像存在,这个剪切将打印200,如果有任何问题,则打印其他内容。特别是,如果它不存在,你会得到404。

然后,您可以在您的shell脚本中这样利用它:

if [ $status -eq 200 ]; then
# do something
else
# do something else
fi

相关内容

  • 没有找到相关文章

最新更新