¿Cómo verificar si una imagen de Docker con una etiqueta específica existe localmente?

117

Me gustaría saber si existe una imagen de Docker con una etiqueta específica a nivel local. Estoy bien usando un script bash si el cliente Docker no puede hacer esto de forma nativa.

Solo para proporcionar algunas sugerencias para un posible script bash, el resultado de ejecutar el docker imagescomando devuelve lo siguiente:

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
fuente

Respuestas:

159

Normalmente pruebo el resultado de docker images -q(como en este script ):

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

Pero ya que docker imagessolo toma REPOSITORYcomo parámetro, necesitaría grep en la etiqueta, sin usar-q.

docker images toma etiquetas ahora (Docker 1.8+) [REPOSITORY[:TAG]]

El otro enfoque que se menciona a continuación es utilizar Docker Inspect .
Pero con la ventana acoplable 17+, la sintaxis de las imágenes es: docker image inspect(en una imagen inexistente, el estado de salida no será 0 )

Como señaló iTayb en los comentarios :

  • El docker images -qmétodo puede volverse muy lento en una máquina con muchas imágenes. Se necesitan 44 segundos para ejecutarse en una máquina de 6.500 imágenes.
  • Las docker image inspectdevoluciones de inmediato.
VonC
fuente
1
¿No estás seguro de si esto funciona para las etiquetas? Cuando hago "docker images -q rabbitmq" devuelve "e8e654c05c91 y a4fbaad9f996" pero si lo hago "docker images -q rabbitmq: 3.4.4" no se devuelve nada aunque la etiqueta exista.
Johan
@Johan ¿Aunque la etiqueta existe localmente?
VonC
@Johan Acabo de verificar dos veces, y el parámetro de imágenes de la ventana acoplable de hecho solo toma el repositorio, no la etiqueta. He editado la respuesta para proponer una solución alternativa.
VonC
1
Gracias que parecen funcionar. Pero tal vez debería editar su respuesta y eliminar ": mytag" de "myimage: mytag" antes de que la acepte.
Johan
para los newbs: ¿cuál es la diferencia entre una imagen (myimage) y una etiqueta (mytag)? ¿por qué myimage: mytag en lugar de solo mytag?
Alexander Mills
37

Pruebe docker inspect, por ejemplo:

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

Pero ahora, con una imagen que existe, obtendrá mucha información, por ejemplo:

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

Y está en un bonito formato json.

Travis Reeder
fuente
6
Esta es la respuesta más programable.
Michael Cole
2
De hecho, imagesy los pscomandos siempre salen con 0, con inspecttan simple como:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg
docker inspectes genial debido al código de retorno distinto de cero cuando no existe ninguna imagen.
cowlinator
Esto también es mucho más rápido entonces docker images -q.
iTayb
26

tldr:

docker image inspect myimage:mytag

A modo de demostración ...

éxito, imagen encontrada:

$ 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

falla, falta la imagen:

$ 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

Referencia:

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

rubicks
fuente
esto fue sencillo, rápido y compatible hasta el futuro. Me quedaré con esta solución.
MarAvFe
17

Puede utilizar como el siguiente:

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

O:

[ -z $(docker images -q someimage:sometag) ] || echo "already exists"
Luís Bianchin
fuente
6
No funciona, al menos en macOS, el valor de retorno es siempre 0.
Gabor Csardi
1
El código es correcto y funciona en linux. Lo único que agregaría son comillas al comando subshell
Draiken
3

Con la ayuda de la respuesta de Vonc anterior, creé el siguiente script de bash llamado 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

Si lo usa para una imagen y una etiqueta existentes, se imprimirá exists, por ejemplo:

./check.sh rabbitmq:3.4.4

Si lo usa para una imagen y una etiqueta que no existen, se imprimirá doesn't exist, por ejemplo:

./check.sh rabbitmq:3.4.3
Johan
fuente
2

Utilizando test

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

o en una línea

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

En caso de que esté intentando buscar una imagen de la ventana acoplable desde un registro de la ventana acoplable, supongo que la forma más fácil de verificar si una imagen de la ventana acoplable está presente es utilizando el servicio de lista de etiquetas de la API REST de Docker V2

Ejemplo:-

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

si el resultado anterior devuelve 200Ok con una lista de etiquetas de imagen, entonces sabemos que la imagen existe

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

si no ves algo como

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

entonces sabes con certeza que esa imagen no existe.

Abhishek J
fuente
2

En el script bash hago esto para verificar si la imagen existe por etiqueta:

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

El script de ejemplo anterior verifica si existe una imagen mysql con etiqueta 5.6. Si solo desea verificar si existe alguna imagen de mysql sin una versión específica, simplemente pase el nombre del repositorio sin etiqueta como este:

IMAGE_NAME="mysql"
Namik Hajiyev
fuente
0

Un poco de mi parte para muy buenos lectores:

Construir

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

Reloj

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

correr

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

para un nombre de etiqueta específico

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

para "cláusula similar" nombre de etiqueta: my_image_tag -> iniciar my_ima *

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

Si quieres algo de "la imagen", por ejemplo, elimina todas las imágenes. La etiqueta comenzó "my_ima", prueba esto.

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