Jak sprawdzić, czy obraz Dockera z określonym tagiem istnieje lokalnie?


117

Chciałbym się dowiedzieć, czy obraz Dockera z określonym tagiem istnieje lokalnie. Dobrze, używając skryptu bash, jeśli klient Docker nie może tego zrobić natywnie.

Aby zapewnić kilka wskazówek dla potencjalnego skryptu bash, wynik uruchomienia docker imagespolecenia zwraca:

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

Odpowiedzi:


160

Zazwyczaj testuję wynik docker images -q(jak w tym skrypcie ):

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

Ale ponieważ docker imagesprzyjmuje tylko REPOSITORYjako parametr, musiałbyś grepować na tagu, bez użycia-q.

docker images pobiera tagi teraz (docker 1.8+) [REPOSITORY[:TAG]]

Innym podejściem wymienionym poniżej jest użycie inspekcji docker .
Ale w przypadku docker 17+ składnia obrazów jest następująca: docker image inspect(w przypadku nieistniejącego obrazu stan wyjścia będzie różny od 0 )

Jak zauważył iTayb w komentarzach :

  • docker images -qSposób można uzyskać bardzo powolny na maszynie z dużą ilością zdjęć. Uruchomienie na maszynie z 6500 obrazami zajmuje 44 sekundy.
  • Te docker image inspectnatychmiast powraca.

1
Nie wiesz, czy to działa w przypadku tagów? Kiedy robię „obrazy docker -q rabbitmq”, zwraca „e8e654c05c91 i a4fbaad9f996”, ale jeśli robię „obrazy docker -q rabbitmq: 3.4.4”, nic nie jest zwracane, mimo że znacznik istnieje.
Johan

@Johan Nawet jeśli tag istnieje lokalnie?
VonC

@Johan Właśnie dwukrotnie sprawdziłem, a parametr docker images rzeczywiście pobiera tylko repozytorium, a nie tag. Zredagowałem odpowiedź, aby zaproponować alternatywne rozwiązanie.
VonC

1
Dzięki, że wydaje się działać. Ale może powinieneś zmienić swoją odpowiedź i usunąć ": mytag" z "myimage: mytag", zanim ją zaakceptuję?
Johan

dla nowicjuszy: jaka jest różnica między obrazem (myimage) a tagiem (mytag)? dlaczego myimage: mytag zamiast po prostu mytag?
Alexander Mills,

37

Spróbuj docker inspectna przykład:

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

Ale teraz, mając już istniejący obraz, otrzymasz kilka informacji, np .:

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

I to w ładnym formacie json.


6
To jest odpowiedź najbardziej skryptu.
Michael Cole

2
Rzeczywiście, imagesi pspolecenia zawsze wyjść z 0, ze inspectjest to tak proste, jak:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg

docker inspectjest świetny ze względu na niezerowy kod powrotu, gdy nie istnieje żaden obraz.
cowlinator

Wtedy też jest znacznie szybsze docker images -q.
iTayb

26

tldr:

docker image inspect myimage:mytag

Tytułem demonstracji ...

sukces, znaleziony obraz:

$ 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

awaria, brak obrazu:

$ 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

Odniesienie:

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


było to proste, szybkie i zgodne aż do przyszłości. Będę się trzymał tego rozwiązania.
MarAvFe

17

Możesz użyć w następujący sposób:

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

Lub:

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

6
Nie działa, przynajmniej na macOS wartość zwracana jest zawsze 0.
Gabor Csardi

1
Kod jest poprawny i działa na Linuksie. Jedyne, co dodałbym, to cytaty do polecenia podpowłoki
Draiken

3

Z pomocą powyższej odpowiedzi Vonc stworzyłem następujący skrypt bash o nazwie 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

Użycie go do istniejącego obrazu i tagu spowoduje wydrukowanie exists, na przykład:

./check.sh rabbitmq:3.4.4

Użycie go do nieistniejącego obrazu i tagu spowoduje wydrukowanie doesn't exist, na przykład:

./check.sh rabbitmq:3.4.3

2

Za pomocą test

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

lub w jednej linii

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

2

W przypadku, gdy próbujesz wyszukać obraz dockera z rejestru docker, myślę, że najłatwiejszym sposobem sprawdzenia, czy obraz dockera jest obecny, jest użycie usługi listy tagów interfejsu API REST Docker V2

Przykład:-

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

jeśli powyższy wynik zwraca 200Ok z listą tagów graficznych, to wiemy, że obraz istnieje

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

inaczej, jeśli zobaczysz coś takiego

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

wtedy wiesz na pewno, że ten obraz nie istnieje.


2

W skrypcie bash robię to, aby sprawdzić, czy obraz istnieje według tagu:

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

Przykładowy skrypt powyżej sprawdza, czy istnieje obraz mysql z tagiem 5.6. Jeśli chcesz po prostu sprawdzić, czy jakikolwiek obraz mysql istnieje bez określonej wersji, po prostu podaj nazwę repozytorium bez tagu w ten sposób:

IMAGE_NAME="mysql"

0

Trochę ode mnie do bardzo dobrych czytelników:

Budować

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

Zegarek

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

Biegać

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

0

dla określonej nazwy tagu

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

dla zmiennej „like clause”: my_image_tag -> start my_ima *

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

jeśli chcesz coś „obraz” na przykład usunąć tag wszystkich obrazów uruchomiony „my_ima” spróbuj tego

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.