Comment vérifier si une image Docker avec une balise spécifique existe localement?

117

J'aimerais savoir si une image Docker avec une balise spécifique existe localement. Je vais bien en utilisant un script bash si le client Docker ne peut pas le faire de manière native.

Juste pour fournir quelques conseils pour un script bash potentiel, le résultat de l'exécution de la docker imagescommande renvoie ce qui suit:

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
la source

Réponses:

160

Je teste généralement le résultat de docker images -q(comme dans ce script ):

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

Mais puisque docker imagesprend seulement REPOSITORYcomme paramètre, vous auriez besoin de grep sur la balise, sans utiliser-q.

docker images prend les balises maintenant (docker 1.8+) [REPOSITORY[:TAG]]

L'autre approche mentionnée ci-dessous consiste à utiliser docker inspect .
Mais avec docker 17+, la syntaxe des images est: docker image inspect(sur une image inexistante, l' état de sortie sera non-0 )

Comme indiqué par iTayb dans les commentaires :

  • La docker images -qméthode peut devenir très lente sur une machine avec beaucoup d'images. Il faut 44 secondes pour fonctionner sur une machine de 6500 images.
  • Le docker image inspectretourne immédiatement.
VonC
la source
1
Hmm pas sûr que cela fonctionne pour les balises? Quand je fais "docker images -q rabbitmq" il renvoie "e8e654c05c91 et a4fbaad9f996" mais si je fais "docker images -q rabbitmq: 3.4.4" rien n'est retourné même si le tag existe.
Johan
@Johan Même si la balise existe localement?
VonC
@Johan J'ai juste vérifié deux fois, et le paramètre images du docker ne prend en effet que le dépôt, pas la balise. J'ai édité la réponse pour proposer une solution alternative.
VonC
1
Merci qui semble fonctionner. Mais peut-être devriez-vous modifier votre réponse et supprimer ": mytag" de "myimage: mytag" avant de l'accepter?
Johan
pour les newbs: quelle est la différence entre une image (myimage) et une balise (mytag)? pourquoi myimage: mytag au lieu de juste mytag?
Alexander Mills
37

Essayez docker inspect, par exemple:

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

Mais maintenant, avec une image qui existe, vous obtiendrez un tas d'informations, par exemple:

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

Et c'est dans un joli format json.

Travis Reeder
la source
6
C'est la réponse la plus scriptable.
Michael Cole
2
En effet, imageset les pscommandes se terminent toujours par 0, avec inspectc'est aussi simple que:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg
docker inspectest génial en raison du code de retour différent de zéro lorsqu'aucune image n'existe.
cowlinator
C'est aussi beaucoup plus rapide alors docker images -q.
iTayb le
26

tldr:

docker image inspect myimage:mytag

En guise de démonstration ...

succès, image trouvée:

$ 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

échec, image manquante:

$ 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

Référence:

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

rubicks
la source
c'était simple, rapide et compatible jusqu'à l'avenir. Je m'en tiendrai à cette solution.
MarAvFe
17

Vous pouvez utiliser comme suit:

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

Ou:

[ -z $(docker images -q someimage:sometag) ] || echo "already exists"
Luís Bianchin
la source
6
Ne fonctionne pas, au moins sur macOS, la valeur de retour est toujours 0.
Gabor Csardi
1
Le code est correct et fonctionne sous Linux. La seule chose que j'ajouterais, ce sont des citations à la commande du sous-shell
Draiken
3

Avec l'aide de la réponse de Vonc ci-dessus, j'ai créé le script bash suivant nommé 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

Son utilisation pour une image et une étiquette existantes s'imprimera exists, par exemple:

./check.sh rabbitmq:3.4.4

En l'utilisant pour une image et une balise non existantes doesn't exist, vous imprimerez , par exemple:

./check.sh rabbitmq:3.4.3
Johan
la source
2

En utilisant test

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

ou en une ligne

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

Si vous essayez de rechercher une image docker à partir d'un registre docker, je suppose que le moyen le plus simple de vérifier si une image docker est présente est d'utiliser le service de liste de balises API REST Docker V2

Exemple:-

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

si le résultat ci-dessus renvoie 200Ok avec une liste de balises d'image, alors nous savons que l'image existe

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

sinon si vous voyez quelque chose comme

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

alors vous savez avec certitude que l'image n'existe pas.

Abhishek J
la source
2

Dans le script bash, je fais ceci pour vérifier si l'image existe par tag:

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

L'exemple de script ci-dessus vérifie si l'image mysql avec la balise 5.6 existe. Si vous voulez simplement vérifier si une image mysql existe sans version spécifique, passez simplement le nom du référentiel sans balise comme suit:

IMAGE_NAME="mysql"
Namik Hajiyev
la source
0

Juste un peu de moi aux très bons lecteurs:

Construire

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

Regarder

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

Courir

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

pour un nom de tag spécifique

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

pour le nom de variable "clause like": my_image_tag -> start my_ima *

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

si vous voulez quelque chose "l'image" par exemple supprimer toutes les images tag commencé "my_ima" essayez ceci

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
corbeau
la source