如何检查本地是否存在带有特定标签的Docker映像?


116

我想找出本地是否存在带有特定标签的Docker映像。如果Docker客户端无法本地执行此操作,那么我可以使用bash脚本。

仅为了提供一些可能的bash脚本提示,运行docker images命令的结果将返回以下内容:

REPOSITORY                               TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
rabbitmq                                 latest              e8e654c05c91        5 weeks ago         143.5 MB
busybox                                  latest              8c2e06607696        6 weeks ago         2.433 MB
rabbitmq                                 3.4.4               a4fbaad9f996        11 weeks ago        131.5 MB

Answers:


159

我通常会测试的结果docker images -q(如以下脚本所示):

if [[ "$(docker images -q myimage:mytag 2> /dev/null)" == "" ]]; then
  # do something
fi

由于docker images仅将其REPOSITORY用作参数,因此您需要在标签上使用grep,而不使用-q

docker images 立即获取标签(docker 1.8+) [REPOSITORY[:TAG]]

下面提到的另一种方法是使用docker inspect
但是,对于docker 17+,图像的语法为:(docker image inspect在不存在的图像上,退出状态将为non-0

正如iTayb评论中指出的:

  • docker images -q在具有大量图像的计算机上,该方法可能会变得非常慢。在6,500张图像的计算机上运行需要44秒。
  • docker image inspect立即返回。

1
嗯不确定这是否适用于标签?当我执行“ docker images -q Rabbitmq”时,它返回“ e8e654c05c91和a4fbaad9f996”,但是如果我执行“ docker images -q Rabbitmq:3.4.4”,即使该标签存在,也不会返回任何内容。
约翰

@Johan即使标记在本地存在?
VonC

@Johan我只是仔细检查了一下,docker images参数确实只接受了仓库,而不是标签。我已经编辑了答案,以提出替代解决方案。
VonC

1
谢谢,似乎工作。但是也许您应该编辑答案并从“ myimage:mytag”中删除“:mytag”?
约翰

对于newbs:图像(myimage)和标签(mytag)有什么区别?为什么使用myimage:mytag而不是mytag?
亚历山大·米尔斯

36

尝试一下docker inspect,例如:

$ docker inspect --type=image treeder/hello.rb:nada
Error: No such image: treeder/hello.rb:nada
[]

但是现在有了一个存在的图像,您将获得大量信息,例如:

$ docker inspect --type=image treeder/hello.rb:latest
[
{
    "Id": "85c5116a2835521de2c52f10ab5dda0ff002a4a12aa476c141aace9bc67f43ad",
    "Parent": "ecf63f5eb5e89e5974875da3998d72abc0d3d0e4ae2354887fffba037b356ad5",
    "Comment": "",
    "Created": "2015-09-23T22:06:38.86684783Z",
    ...
}
]

而且它是一个不错的json格式。


6
这是最可脚本化的答案。
Michael Cole

2
事实上,imagesps命令始终以0退出,与inspect它的简单:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
埃里克·丹嫩贝格

docker inspect之所以出色,是因为没有图像时返回代码为非零。
cowlinator '18

这也快得多docker images -q
iTayb

26

tldr:

docker image inspect myimage:mytag

通过示范...

成功,发现图片:

$ docker image pull busybox:latest
latest: Pulling from library/busybox
Digest: sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f
Status: Image is up to date for busybox:latest

$ docker image inspect busybox:latest >/dev/null 2>&1 && echo yes || echo no
yes

失败,图像丢失:

$ docker image rm busybox:latest
Untagged: busybox:latest
Untagged: busybox@sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f

$ docker image inspect busybox:latest >/dev/null 2>&1 && echo yes || echo no
no

参考:

https://docs.docker.com/engine/reference/commandline/image_inspect/


这是直截了当的,快速的并且可以兼容将来。我会坚持这种解决方案。
MarAvFe

17

您可以像下面这样使用:

[ ! -z $(docker images -q someimage:sometag) ] || echo "does not exist"

要么:

[ -z $(docker images -q someimage:sometag) ] || echo "already exists"

6
不工作,至少MacOS的,返回值始终为0
的Gabor Csardi

1
该代码是正确的,并且可以在Linux上运行。我唯一要添加的是subshel​​l命令的引号
Draiken

3

借助上面的Vonc的答案,我创建了以下bash脚本,名为check.sh

#!/bin/bash
image_and_tag="$1"
image_and_tag_array=(${image_and_tag//:/ })
if [[ "$(docker images ${image_and_tag_array[0]} | grep ${image_and_tag_array[1]} 2> /dev/null)" != "" ]]; then
  echo "exists"
else
  echo "doesn't exist"
fi

将其用于现有图像和标签将进行打印exists,例如:

./check.sh rabbitmq:3.4.4

将其用于不存在的图像和标签将进行打印doesn't exist,例如:

./check.sh rabbitmq:3.4.3

2

使用 test

if test ! -z "$(docker images -q <name:tag>)"; then
  echo "Exist"
fi

或一行

test ! -z "$(docker images -q <name:tag>)" &&  echo exist

2

如果您尝试从Docker注册表中搜索Docker映像,我想检查Docker映像是否存在的最简单方法是使用Docker V2 REST API 标签列表服务

例:-

curl $CURLOPTS -H "Authorization: Bearer $token" "https://hub.docker.com:4443/v2/your-repo-name/tags/list"

如果以上结果返回200OK并带有图像标签列表,那么我们知道该图像存在

{"name":"your-repo-name","tags":["1.0.0.1533677221","1.0.0.1533740305","1.0.0.1535659921","1.0.0.1535665433","latest"]}

否则,如果您看到类似

{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"your-repo-name"}}]} 

那么您可以确定该图像不存在。


2

在bash脚本中,我这样做是为了检查图像是否存在标签:

IMAGE_NAME="mysql:5.6"

if docker image ls -a "$IMAGE_NAME" | grep -Fq "$IMAGE_NAME" 1>/dev/null; then
echo "could found image $IMAGE_NAME..."
fi

上面的示例脚本检查是否存在带有5.6标记的mysql映像。如果您只想检查是否存在没有特定版本的mysql映像,则只需传递不带标签的存储库名称,如下所示:

IMAGE_NAME="mysql"

0

我对非常好的读者只有一点点:

建立

#!/bin/bash -e
docker build -t smpp-gateway smpp
(if  [ $(docker ps -a | grep smpp-gateway | cut -d " " -f1) ]; then \
  echo $(docker rm -f smpp-gateway); \
else \
  echo OK; \
fi;);
docker run --restart always -d --network="host" --name smpp-gateway smpp-gateway:latest

docker logs --tail 50 --follow --timestamps smpp-gateway

sudo docker exec -it \
$(sudo docker ps | grep "smpp-gateway:latest" | cut -d " " -f1) \
/bin/bash

0

用于特定标签名称

$ docker images  --filter reference='<REPOSITORY>:TAG'

对于“喜欢子句”标记名:my_image_tag->开始my_ima *

$ docker images  --filter reference='<REPOSITORY>:my_ima*'

如果要添加“图像”,例如删除所有图像标签,则启动“ my_ima”,请尝试此操作

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.