Я пытаюсь найти тег, соответствующий определенному репозиторию изображений в реестре Docker.
curl -X GET http://my-registry-ip-address/v2/ancean-api/tags/list\
result: {"name":"ancean-api","tags":["v1.0.0","v19.0.0","v11.1.1"]}
Как проверить, существует ли тег v1.0.0(example) в выходных данных json, как показано выше?
Я пытался
curl -X GET http://my-registry-ip-address/v2/ancean-api/tags/list | jq '.tags | select(. == v1.0.19)'
jq-документ Документ jq попытался использовать select, но потерпел неудачу. Приведенная выше команда успешна независимо от того, какой тег используется.
curl -X GET http://my-registry-ip-address/v2/ancean-api/tags/list | jq '.tags | .[]' | grep "v1.0.0"
Я пытался использовать его с grep, но безуспешно.
Через ответ в личку решил проблему с функцией IN
.
curl -X GET http://my-registry-ip-address/v2/ancean-api/tags/list | jq IN'(.tags[]; "v1.0.0")'
Используя IN
, я смог вернуть значение bool, когда в данных json было определенное значение.
Если объект, содержащий ключ tags
, находится внутри ключа default
другого объекта (как показано в вашем примере, хотя кавычки отсутствуют), вам необходимо включить его в путь.
Там вы можете использовать функцию IN
для проверки содержания рассматриваемого элемента, которая выдает логическое значение:
IN(.default.tags[]; "v1.0.0")
Кроме того, флаг --exit-status
(или -e
) может устанавливать статус выхода в зависимости от результата.
if curl -X GET http://$REGISTRY/v2/$IMAGE_NAME/tags/list | jq --arg tag "$IMAGE_TAG" -e 'IN(.tags[]; $tag) | not' >/dev/null; then …; else …; fi
Спасибо за ваш ответ. Я решил проблему через ваш ответ. [[ $(curl -X GET http://$REGISTRY/v2/$IMAGE_NAME/tags/list | jq IN'(.tags[]; "'${IMAGE_TAG}'")') = "false" ]] Приведенный выше код позволяет проверить наличие тега запрошенного изображения в реестре. И дефолт - это моя ошибка. по умолчанию не используются данные, содержащиеся в данных JSON. Мне следовало использовать результат, но это опечатка. Я очень ценю вашу помощь.