Come verificare se un'immagine Docker con un tag specifico esiste localmente?


117

Mi piacerebbe scoprire se un'immagine Docker con un tag specifico esiste localmente. Sto bene usando uno script bash se il client Docker non può farlo in modo nativo.

Solo per fornire alcuni suggerimenti per un potenziale script bash, il risultato dell'esecuzione del docker imagescomando restituisce quanto segue:

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

Risposte:


159

Di solito provo il risultato di docker images -q(come in questo script ):

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

Ma poiché docker imagesprende solo REPOSITORYcome parametro, dovresti eseguire grep sul tag, senza usare-q.

docker images accetta i tag ora (finestra mobile 1.8+) [REPOSITORY[:TAG]]

L'altro approccio menzionato di seguito consiste nell'usare docker inspect .
Ma con la finestra mobile 17+, la sintassi per le immagini è: docker image inspect(su un'immagine inesistente, lo stato di uscita sarà diverso da 0 )

Come notato da iTayb nei commenti :

  • Il docker images -qmetodo può diventare molto lento su una macchina con molte immagini. Ci vogliono 44 secondi per funzionare su una macchina da 6.500 immagini.
  • La docker image inspectritorna immediatamente.

1
Hmm non sei sicuro che funzioni per i tag? Quando eseguo "docker images -q rabbitmq" restituisce "e8e654c05c91 e a4fbaad9f996" ma se lo faccio "docker images -q rabbitmq: 3.4.4" non viene restituito nulla anche se il tag esiste.
Johan

@ Johan Anche se il tag esiste localmente?
VonC

@Johan Ho appena ricontrollato e il parametro delle immagini docker accetta solo il repository, non il tag. Ho modificato la risposta per proporre una soluzione alternativa.
VonC

1
Grazie che sembra funzionare. Ma forse dovresti modificare la tua risposta e rimuovere ": mytag" da "myimage: mytag" prima che lo accetti?
Johan

per i newb: qual è la differenza tra un'immagine (myimage) e un tag (mytag)? perché myimage: mytag invece di mytag?
Alexander Mills

37

Prova docker inspect, ad esempio:

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

Ma ora con un'immagine che esiste, otterrai un sacco di informazioni, ad esempio:

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

Ed è in un bel formato json.


6
Questa è la risposta più scriptabile.
Michael Cole

2
Infatti, imagese i pscomandi escono sempre con 0, con inspectè semplice come:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg

docker inspectè fantastico a causa del codice di ritorno diverso da zero quando non esiste alcuna immagine.
cowlinator

Anche questo è molto più veloce allora docker images -q.
iTayb

26

TLDR:

docker image inspect myimage:mytag

A titolo di dimostrazione ...

successo, immagine trovata:

$ 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

errore, immagine mancante:

$ 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

Riferimento:

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


questo era semplice, veloce e compatibile fino al futuro. Mi atterrò a questa soluzione.
MarAvFe

17

Puoi usare come segue:

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

O:

[ -z $(docker images -q someimage:sometag) ] || echo "already exists"

6
Non funziona, almeno su macOS, il valore di ritorno è sempre 0.
Gabor Csardi

1
Il codice è corretto e funziona su Linux. L'unica cosa che aggiungerei sono le virgolette al comando subshell
Draiken

3

Con l'aiuto della risposta di Vonc sopra ho creato il seguente script bash denominato 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

Usandolo per un'immagine e un tag esistenti verranno stampati exists, ad esempio:

./check.sh rabbitmq:3.4.4

Usandolo per un'immagine e un tag non esistenti verranno stampati doesn't exist, ad esempio:

./check.sh rabbitmq:3.4.3

2

utilizzando test

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

o in una riga

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

2

Nel caso in cui si stia tentando di cercare un'immagine docker da un registro docker, immagino che il modo più semplice per verificare se è presente un'immagine docker è utilizzare il servizio di elenco tag API REST Docker V2

Esempio:-

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

se il risultato precedente restituisce 200Ok con un elenco di tag immagine, allora sappiamo che l'immagine esiste

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

altrimenti se vedi qualcosa di simile

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

allora sai per certo che l'immagine non esiste.


2

Nello script bash lo faccio per verificare se l'immagine esiste per 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

Lo script di esempio sopra controlla se esiste un'immagine mysql con tag 5.6. Se vuoi solo controllare se esiste un'immagine mysql senza una versione specifica, passa semplicemente il nome del repository senza tag come questo:

IMAGE_NAME="mysql"

0

Solo un po 'da me a ottimi lettori:

Costruire

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

Orologio

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

Correre

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

0

per il nome del tag specifico

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

per "clausola like" tagname: my_image_tag -> start my_ima *

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

se vuoi qualcosa "l'immagine", ad esempio, elimina tutte le immagini tag iniziato "my_ima" prova questo

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.