web-dev-qa-db-fra.com

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

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 en natif.

Juste pour fournir quelques astuces pour un script bash potentiel, le résultat de l'exécution de la commande docker images renvoie les éléments suivants:

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

Je teste habituellement 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 comme docker images prend seulement REPOSITORY en paramètre, vous auriez besoin de grep sur une balise, sans utiliser -q.

docker images prend les tags 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 la suivante: docker image inspect (sur une image inexistante, le statut de sortie sera non-0 )

97
VonC

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 format json sympa. 

19
Travis Reeder

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/

11
rubicks

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"
11
Luís Bianchin

Avec l'aide de la réponse de Vonc above 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 balise existantes imprimera exists, par exemple:

./check.sh rabbitmq:3.4.4

Son utilisation pour une image et une balise non existantes imprimera doesn't exist, par exemple:

./check.sh rabbitmq:3.4.3
3
Johan

Utiliser 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
1
Alex Montoya

Si vous essayez de rechercher une image Docker dans un registre Docker, le meilleur moyen de vérifier si une image Docker est présente consiste à utiliser le service de liste Docker V2 REST API Tags

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 cette 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.

0
Abhishek J

Juste un peu de ma part à de 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
0
Artur Mustafin