我想检查注册表中是否存在具有特定标签的docker镜像。
我看到了这个帖子: 如何检查本地是否存在带有特定标签的 docker 镜像
但它处理本地系统上的图像。
如何使用
docker image inspect
(或其他命令)检查远程注册表上是否存在具有特定标签的图像?
我不用拉就找到了路:
curl -X GET http://my-registry/v2/image_name/tags/list
地点:
结果显示注册表中所有标签
另一种可能性是使用
docker pull
- 如果退出代码为 1,则它不存在。如果退出代码为 0,则它确实存在。
docker pull <my-registry/my-image:my-tag>
echo $? # print exit code
缺点:如果镜像确实存在(但不在本地),即使您不想,它也会拉取整个镜像。根据您实际想要做和实现的目标,这可能是一个解决方案,也可能是浪费时间。
有
docker search
,但它仅适用于 Docker Hub。通用解决方案是使用 docker pull
: 的简单 shell 脚本
#!/bin/bash
function check_image() {
# pull image
docker pull $1 >/dev/null 2>&1
# save exit code
exit_code=$?
if [ $exit_code = 0 ]; then
# remove pulled image
docker rmi $1 >/dev/null 2>&1
echo Image $1 exists!
else
echo "Image $1 does not exist :("
fi
}
check_image hello-world:latest
# will print 'Image hello-world:latest exists!'
check_image hello-world:nonexistent
# will print 'Image hello-world:nonexistent does not exist :('
上述方法的缺点是拉取图像的速度慢且需要可用空间。
如果您使用的是 AWS ECR,则可以使用此处提供的解决方案 https://gist.github.com/outofcoffee/8f40732aefacfded14cce8a45f6e5eb1
这使用 AWS CLI 查询 ECR 并将使用您配置的任何凭证。这可以让您更轻松,因为如果您已经在 AWS 中使用这些凭证,则无需直接担心此请求的凭证。
从此处复制要点中的解决方案
#!/usr/bin/env bash
# Example:
# ./find-ecr-image.sh foo/bar mytag
if [[ $# -lt 2 ]]; then
echo "Usage: $( basename $0 ) <repository-name> <image-tag>"
exit 1
fi
IMAGE_META="$( aws ecr describe-images --repository-name=$1 --image-ids=imageTag=$2 2> /dev/null )"
if [[ $? == 0 ]]; then
IMAGE_TAGS="$( echo ${IMAGE_META} | jq '.imageDetails[0].imageTags[0]' -r )"
echo "$1:$2 found"
else
echo "$1:$2 not found"
exit 1
fi
使用 Azure 容器注册表时,您可以使用 Azure CLI 来探测映像标签,而无需拉取。
$ az acr repository show -n myregistry --image path/to/image:some-tag