特定のタグを持つ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

回答:


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(存在しない画像では、終了ステータスは0以外になります)。

で述べたようにiTaybコメント

  • このdocker images -q方法は、画像が多いマシンでは非常に遅くなる可能性があります。6,500イメージマシンで実行するには44秒かかります。
  • docker image inspectすぐに戻ります。

1
これがタグで機能するかどうかわかりませんか?「docker images -q rabbitmq」を実行すると「e8e654c05c91 and a4fbaad9f996」が返されますが、「docker images -q rabbitmq:3.4.4」を実行すると、タグが存在しても何も返されません。
ヨハン、

@Johanタグがローカルに存在していても?
VonC、2015年

@Johan私はダブルチェックしました、そしてdocker imagesパラメータは実際にはタグではなくレポだけを取ります。私は別の解決策を提案するために答えを編集しました。
VonC、2015年

1
うまくいったように感謝します。しかし、おそらく、回答を編集して、「myimage:mytag」から「:mytag」を削除してから、それを受け入れる必要がありますか?
ヨハン

newbsの場合:画像(myimage)とタグ(mytag)の違いは何ですか?mytagだけでなくmyimage:mytagを使用する理由
Alexander Mills

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!"
エリックDannenberg

docker inspect画像が存在しない場合のゼロ以外の戻りコードのため、素晴らしいです。
カウリネーター

これはまた、はるかに高速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ではありません
ガボールCsardi

1
コードは正しく、Linuxで動作します。私が追加するのは、サブシェルコマンドの引用だけです
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 V2 REST API タグリストサービスを使用することです

例:-

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

上記の結果が画像タグのリストで200kを返す場合、画像が存在することがわかります

{"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'

「いいね句」の場合tagname:my_image_tag-> start my_ima *

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

たとえば、「画像」を作成したい場合は、「my_ima」で始まるすべての画像タグを削除します。

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.