Wie überprüfe ich, ob ein Docker-Image mit einem bestimmten Tag lokal vorhanden ist?

116

Ich möchte herausfinden, ob lokal ein Docker-Image mit einem bestimmten Tag vorhanden ist. Ich kann ein Bash-Skript verwenden, wenn der Docker-Client dies nicht nativ ausführen kann.

Um nur einige Hinweise für ein potenzielles Bash-Skript zu geben, gibt das Ergebnis der Ausführung des docker imagesBefehls Folgendes zurück:

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
Johan
quelle

Antworten:

159

Normalerweise teste ich das Ergebnis von docker images -q(wie in diesem Skript ):

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

Aber Da docker imagesnur REPOSITORYals Parameter verwendet wird, müssten Sie das Tag ohne Verwendung grep-q.

docker images Nimmt jetzt Tags (Docker 1.8+) [REPOSITORY[:TAG]]

Der andere unten erwähnte Ansatz ist die Verwendung von Docker Inspect .
Bei Docker 17+ lautet die Syntax für Bilder jedoch: docker image inspect(Bei einem nicht vorhandenen Bild ist der Beendigungsstatus nicht 0. )

Wie von iTayb in den Kommentaren vermerkt :

  • Die docker images -qMethode kann auf einer Maschine mit vielen Bildern sehr langsam werden. Die Ausführung auf einem 6.500-Bilder-Computer dauert 44 Sekunden.
  • Die docker image inspectRückgabe erfolgt sofort.
VonC
quelle
1
Hmm nicht sicher, ob dies für Tags funktioniert? Wenn ich "Docker-Bilder -q rabbitmq" mache, wird "e8e654c05c91 und a4fbaad9f996" zurückgegeben, aber wenn ich "Docker-Bilder -q rabbitmq: 3.4.4" mache, wird nichts zurückgegeben, obwohl das Tag existiert.
Johan
@Johan Auch wenn das Tag lokal existiert?
VonC
@Johan Ich habe es gerade noch einmal überprüft, und der Docker-Images-Parameter nimmt tatsächlich nur das Repo, nicht das Tag. Ich habe die Antwort bearbeitet, um eine alternative Lösung vorzuschlagen.
VonC
1
Danke, das scheint zu funktionieren. Aber vielleicht sollten Sie Ihre Antwort bearbeiten und ": mytag" aus "myimage: mytag" entfernen, bevor ich sie akzeptiere?
Johan
für die newbs: was ist der unterschied zwischen einem bild (myimage) und einem tag (mytag)? warum myimage: mytag statt nur mytag?
Alexander Mills
35

Versuchen Sie docker inspectzum Beispiel:

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

Aber jetzt mit einem Bild, das existiert, erhalten Sie eine Reihe von Informationen, z.

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

Und es ist in einem schönen JSON-Format.

Travis Reeder
quelle
6
Dies ist die am besten skriptfähige Antwort.
Michael Cole
2
In der Tat, imagesund psBefehle inspectdocker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg
docker inspectist großartig wegen des Rückkehrcodes ungleich Null, wenn kein Bild vorhanden ist.
Cowlinator
Das geht dann auch viel schneller docker images -q.
iTayb
26

tldr:

docker image inspect myimage:mytag

Zur Demonstration ...

Erfolg, gefundenes Bild:

$ 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

Fehler, fehlendes Bild:

$ 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

Referenz:

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

Rubicks
quelle
Dies war unkompliziert, schnell und bis in die Zukunft kompatibel. Ich werde mich an diese Lösung halten.
MarAvFe
17

Sie können wie folgt verwenden:

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

Oder:

[ -z $(docker images -q someimage:sometag) ] || echo "already exists"
Luís Bianchin
quelle
6
Funktioniert nicht, zumindest unter MacOS ist der Rückgabewert immer 0.
Gabor Csardi
1
Der Code ist korrekt und funktioniert unter Linux. Ich würde nur Anführungszeichen zum Subshell-Befehl
hinzufügen
3

Mit Hilfe der obigen Antwort von Vonc habe ich das folgende Bash-Skript mit dem Namen erstellt 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

Wenn Sie es für ein vorhandenes Bild und Tag verwenden, wird Folgendes gedruckt exists:

./check.sh rabbitmq:3.4.4

Wenn Sie es für ein nicht vorhandenes Bild und Tag verwenden, wird Folgendes gedruckt doesn't exist:

./check.sh rabbitmq:3.4.3
Johan
quelle
2

Verwenden von test

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

oder in einer Zeile

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

Falls Sie für ein Docker Bild von einem Docker Registry suchen versuchen, ich denke , der einfachste Weg , um zu überprüfen , ob ein Docker Bild unter Verwendung der vorhanden ist Docker V2 REST API Stichworte Listendienst

Beispiel:-

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

Wenn das obige Ergebnis 200Ok mit einer Liste von Bild-Tags zurückgibt, wissen wir, dass das Bild vorhanden ist

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

sonst wenn du so etwas siehst

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

dann wissen Sie sicher, dass das Bild nicht existiert.

Abhishek J.
quelle
2

Im Bash-Skript überprüfe ich, ob das Bild nach Tag vorhanden ist:

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

Das obige Beispielskript prüft, ob ein MySQL-Bild mit dem Tag 5.6 vorhanden ist. Wenn Sie nur überprüfen möchten, ob ein MySQL-Image ohne bestimmte Version vorhanden ist, übergeben Sie einfach den Repository-Namen ohne Tag wie folgt:

IMAGE_NAME="mysql"
Namik Hajiyev
quelle
0

Nur ein bisschen von mir zu sehr guten Lesern:

Bauen

#!/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

Beobachten

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

Lauf

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

für einen bestimmten Tag-Namen

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

für "like Klausel" Tagname: my_image_tag -> starte my_ima *

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

Wenn Sie beispielsweise "das Bild" löschen möchten, löschen Sie alle Bilder, die mit "my_ima" gestartet wurden. Versuchen Sie dies

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
Rabe
quelle