Como verificar se uma imagem Docker com uma tag específica existe localmente?

116

Gostaria de descobrir se uma imagem Docker com uma tag específica existe localmente. Estou bem usando um script bash se o cliente Docker não puder fazer isso nativamente.

Apenas para fornecer algumas dicas para um possível script bash, o resultado da execução do docker imagescomando retorna o seguinte:

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
João
fonte

Respostas:

159

Eu costumo testar o resultado de docker images -q(como neste script ):

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

Mas uma vez que docker imagesleva apenas REPOSITORYcomo parâmetro, você precisaria fazer um grep na tag, sem usar-q.

docker images leva tags agora (docker 1.8+) [REPOSITORY[:TAG]]

A outra abordagem mencionada abaixo é usar docker inspect .
Mas com docker 17+, a sintaxe para imagens é: docker image inspect(em uma imagem inexistente, o status de saída será diferente de 0 )

Conforme observado por iTayb nos comentários :

  • O docker images -qmétodo pode ficar muito lento em uma máquina com muitas imagens. Leva 44 segundos para rodar em uma máquina de 6.500 imagens.
  • O docker image inspectretorno imediatamente.
VonC
fonte
1
Hmm, não tem certeza se isso funciona para tags? Quando faço "docker images -q rabbitmq", ele retorna "e8e654c05c91 e a4fbaad9f996", mas se faço "docker images -q rabbitmq: 3.4.4" nada é retornado, embora a tag exista.
Johan
@Johan Mesmo que a tag exista localmente?
VonC
@Johan, acabei de verificar e o parâmetro docker images de fato só leva o repo, não a tag. Eu editei a resposta para propor uma solução alternativa.
VonC
1
Obrigado, isso parece funcionar. Mas talvez você deva editar sua resposta e remover ": mytag" de "myimage: mytag" antes de eu aceitá-la?
Johan
para o newbs: qual é a diferença entre uma imagem (myimage) e uma tag (mytag)? porque myimage: mytag em vez de apenas mytag?
Alexander Mills
36

Experimente docker inspect, por exemplo:

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

Mas agora com uma imagem que existe, você obterá um monte de informações, por exemplo:

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

E está em um bom formato json.

Travis Reeder
fonte
6
Esta é a resposta mais programável.
Michael Cole
2
Na verdade, os comandos imagese pssempre saem com 0, com inspecté tão simples como:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg
docker inspecté ótimo por causa do código de retorno diferente de zero quando nenhuma imagem existe.
cowlinator
Isso também é muito mais rápido docker images -q.
iTayb
26

tldr:

docker image inspect myimage:mytag

A título de demonstração ...

sucesso, imagem 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

falha, imagem ausente:

$ 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

Referência:

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

rubicks
fonte
isso era simples, rápido e compatível com o futuro. Vou ficar com esta solução.
MarAvFe
17

Você pode usar como o seguinte:

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

Ou:

[ -z $(docker images -q someimage:sometag) ] || echo "already exists"
Luís Bianchin
fonte
6
Não funciona, pelo menos no macOS, o valor de retorno é sempre 0.
Gabor Csardi 30/11/16
1
O código está correto e funciona no Linux. A única coisa que eu adicionaria são aspas ao comando subshell
Draiken
3

Com a ajuda da resposta de Vonc acima, criei o seguinte script bash chamado 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

Usá-lo para uma imagem e tag existentes imprimirá exists, por exemplo:

./check.sh rabbitmq:3.4.4

Usá-lo para uma imagem não existente e a tag imprimirá doesn't exist, por exemplo:

./check.sh rabbitmq:3.4.3
João
fonte
2

Usando test

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

ou em uma linha

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

Caso você esteja tentando pesquisar uma imagem do docker a partir de um registro do docker, acho que a maneira mais fácil de verificar se uma imagem do docker está presente é usando o serviço de lista de tags da API REST do Docker V2

Exemplo:-

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

se o resultado acima retornar 200Ok com uma lista de tags de imagem, então sabemos que a imagem existe

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

mais se você ver algo como

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

então você tem certeza de que essa imagem não existe.

Abhishek J
fonte
2

No script bash, faço isso para verificar se a imagem existe por 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

O script de exemplo acima verifica se a imagem mysql com a tag 5.6 existe. Se você quiser apenas verificar se existe alguma imagem mysql sem uma versão específica, basta passar o nome do repositório sem tag como este:

IMAGE_NAME="mysql"
Namik Hajiyev
fonte
0

Um pouco de mim para leitores muito bons:

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

Ver

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

Corre

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

para nome de tag específico

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

para "cláusula like" tagname: my_image_tag -> start my_ima *

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

se você quiser algo "a imagem", por exemplo, deletar todas as imagens com a tag iniciada "my_ima", tente isto

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