如何检查具有特定标记的Docker镜像是否存在于本地?

Joh*_*han 90 bash docker

我想知道本地是否存在具有特定标记的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
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 123

我经常测试结果docker images -q(如在这个脚本中):

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

因为docker imagesREPOSITORY作为参数,你需要grep on tag,而不使用-q.

docker images 现在拿标签(docker 1.8+) [REPOSITORY[:TAG]]

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


Tra*_*der 29

试试docker inspect,例如:

$ docker inspect --type=image treeder/hello.rb:nada
Error: No such image: treeder/hello.rb:nada
[]
Run Code Online (Sandbox Code Playgroud)

但是现在有了一个存在的图像,你会得到一堆信息,例如:

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

它是一个很好的json格式.

  • 这是最易编写的答案. (5认同)
  • 实际上,“ images”和“ ps”命令始终以0退出,而使用“ inspect”则很简单:`docker inspect“ $ {image_id}:$ {image_tag}”> / dev / null 2>&1 || 回声“不存在!” (2认同)
  • `docker inspect` 很棒,因为当不存在图像时返回非零代码。 (2认同)

rub*_*cks 17

tldr:

docker image inspect myimage:mytag
Run Code Online (Sandbox Code Playgroud)

通过示范......

成功,找到图片:

$ 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
Run Code Online (Sandbox Code Playgroud)

失败,缺少图像:

$ 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
Run Code Online (Sandbox Code Playgroud)

参考:

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


Luí*_*hin 15

你可以使用如下:

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

要么:

[ -z $(docker images -q someimage:sometag) ] || echo "already exists"
Run Code Online (Sandbox Code Playgroud)

  • 不起作用,至少在macOS上,返回值始终为0. (4认同)
  • 代码是正确的,可以在 linux 上运行。我唯一要添加的是 subshel​​l 命令的引号 (2认同)
  • @GaborCsardi 这个适用于 MacOS: `[[ -z "$(docker images -q someimage:sometag)" ]] || echo "exists"` 以及 `[[​​ -n "$(docker images -q someimage:sometag)" ]] || echo“不存在”`。编辑后的答案。现在应该可以正常工作了。加博,你能确认一下吗? (2认同)