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
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 )
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.
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/
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"
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
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
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.
Juste un peu de ma part à de très bons lecteurs:
#!/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