Hoe kan ik controleren of een Docker-afbeelding met een specifieke tag lokaal bestaat?

Ik zou graag willen weten of er lokaal een Docker-afbeelding met een specifieke tag bestaat. Ik vind het prima om een ​​bash-script te gebruiken als de Docker-client dit niet native kan doen.

Om wat hints te geven voor een mogelijk bash-script, geeft het resultaat van het uitvoeren van de opdracht docker imageshet volgende terug:

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

Antwoord 1, autoriteit 100%

Ik test meestal het resultaat van docker images -q(zoals in dit script):

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

Maar aangezien docker imagesalleen REPOSITORYals parameter gebruikt, zou je de tag grep moeten gebruiken, zonder -q< te gebruiken /del>.

docker imagesneemt nu tags ( docker 1.8+) [REPOSITORY[:TAG]]

De andere benadering die hieronder wordt genoemd, is om docker inspectte gebruiken.

Maar met docker 17+ is de syntaxis voor afbeeldingen: docker image inspect(op een niet-bestaande afbeelding, de afsluiten status zal niet-0 zijn)

Zoals opgemerkt door iTaybin de opmerkingen:

  • De docker images -qmethode kan erg traag worden op een machine met veel afbeeldingen. Het duurt 44 seconden om op een machine met 6.500 afbeeldingen te draaien.
  • De docker image inspectkeert onmiddellijk terug.

Zoals opgemerkt in de opmerkingen van Henry Blyth:

Als u docker image inspect my_image:my_taggebruikt en u de uitvoer wilt negeren, kunt u --format="ignore me"toevoegen en het wordt afgedrukt dat letterlijk.

Je kunt stdout ook omleiden door >/dev/nulltoe te voegen, maar als je dat niet in je script kunt doen, werkt de opmaakoptie netjes.


Antwoord 2, autoriteit 26%

Probeer docker inspect, bijvoorbeeld:

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

Maar nu met een bestaande afbeelding, krijg je een heleboel informatie, bijvoorbeeld:

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

En het is in een mooi json-formaat.


Antwoord 3, autoriteit 18%

tldr:

docker image inspect myimage:mytag

Bij wijze van demonstratie…

succes, gevonden afbeelding:

$ 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

mislukt, ontbrekende afbeelding:

$ 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

Referentie:

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


Antwoord 4, autoriteit 13%

U kunt als volgt gebruiken:

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

Of:

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

Antwoord 5

Met behulp van Vonc’s antwoordhierboven heb ik het volgende bash-script gemaakt met de naam 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

Als je het gebruikt voor een bestaande afbeelding en tag, wordt existsafgedrukt, bijvoorbeeld:

./check.sh rabbitmq:3.4.4

Als je het gebruikt voor een niet-bestaande afbeelding en tag, wordt doesn't existafgedrukt, bijvoorbeeld:

./check.sh rabbitmq:3.4.3

Antwoord 6

In het geval dat u probeert te zoeken naar een docker-image van een docker-register, denk ik dat de gemakkelijkste manier om te controleren of een docker-image aanwezig is, is door de Docker V2 REST API Tagslijstservice

Voorbeeld:-

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

als het bovenstaande resultaat 200Ok retourneert met een lijst met afbeeldingstags, dan weten we dat die afbeelding bestaat

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

anders als je iets ziet als

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

dan weet je zeker dat die afbeelding niet bestaat.


Antwoord 7

Gebruik test

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

of in één regel

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

Antwoord 8

In bash-script doe ik dit om te controleren of de afbeelding bestaat door 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

Voorbeeldscript hierboven controleert of mysql-afbeelding met 5.6-tag bestaat. Als je gewoon wilt controleren of er een mysql-afbeelding bestaat zonder specifieke versie, geef dan de naam van de repository zonder tag als volgt door:

IMAGE_NAME="mysql"

Antwoord 9

Geïnspireerd door de reactie van @rubicks hierboven.

Om te controleren of de afbeelding al bestaat

image_name_tag="alpine:3.13.3"
docker image inspect ${image_name_tag} > /dev/null
echo $?

Trek als afbeelding niet bestaat

docker image inspect ${image_name_tag} > /dev/null || docker  pull ${image_name_tag}

Demo-uitvoering

# image_name_tag="alpine:3.13.3"
# 
# docker image inspect ${image_name_tag} > /dev/null
echo $?
Error: No such image: alpine:3.13.3
# echo $?
1
# docker image inspect ${image_name_tag} > /dev/null || docker  pull ${image_name_tag}
Error: No such image: alpine:3.13.3
3.13.3: Pulling from library/alpine
9aae54b2144e: Pull complete 
Digest: sha256:826f70e0ac33e99a72cf20fb0571245a8fee52d68cb26d8bc58e53bfa65dcdfa
Status: Downloaded newer image for alpine:3.13.3
docker.io/library/alpine:3.13.3
# docker image inspect ${image_name_tag} > /dev/null || docker  pull ${image_name_tag}
$ 

Antwoord 10

Een klein stukje van mij voor hele goede lezers:

Bouw

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

Kijk

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

Rennen

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

Antwoord 11

voor specifieke tagnaam

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

voor “like-clausule” tagname:my_image_tag –> start my_ima*

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

als je iets “de afbeelding” wilt, bijvoorbeeld alle afbeeldingen verwijderen die met de tag “my_ima” zijn begonnen, probeer dit dan

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

Antwoord 12

Ik denk dat deze functionaliteit moet worden geïmplementeerd in de opdracht docker build(met een vlag?), zodat veel codeduplicatie wordt voorkomen.

Ik heb dezelfde voorwaarde gebruikt als het geaccepteerde antwoordin een wrapper-functie genaamd docker_builddus dat het de nodige controles uitvoert voordat het originele docker buildcommando wordt aangeroepen.

# Usage: docker_build <...> (instead of docker build)
docker_build()
{
    local arguments=("$@")
    local index
    for (( index=0; index<$#; index++ )); do
        case ${arguments[index]} in
            --tag)
                local tag=${arguments[index+1]}
                if [[ ! -z $(docker images -q "${tag}" 2> /dev/null) ]]; then
                    echo "Image ${tag} already exists."
                    return
                fi
                ;;
        esac
    done
    command docker build "$@"
}

Disclaimer: dit is nog niet klaar voor productie omdat het alleen werkt met door spaties gescheiden argumenten in een lang formaat, bijv. --tag hello-world:latest. Dit wijzigt ook alleen de opdracht docker build, alle andere opdrachten blijven hetzelfde. Als iemand verbeteringen heeft, laat het me dan weten.

Ik had zin om dit fragment te delen omdat het idee om standaardcommando’s in bash-functies in te pakken, om herhaling van code te voorkomen, eleganter en schaalbaarder leek dan het schrijven van wrapper-instructies.


Antwoord 13

Ik vind dit leuk omdat het beknopt is en de juiste semantiek heeft. Als de afbeelding bestaat, is het waar, wat kan er gemakkelijker zijn?

if [ $(docker image ls ${build_env} --format="true") ] ; 
then
 echo "does exist"
fi

Other episodes