在给定的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