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 images
het 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 images
alleen REPOSITORY
als parameter gebruikt, zou je de tag grep moeten gebruiken, zonder -q
< te gebruiken /del>.
docker images
neemt 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 -q
methode 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 inspect
keert onmiddellijk terug.
Zoals opgemerkt in de opmerkingen van Henry Blyth:
Als u
docker image inspect my_image:my_tag
gebruikt 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/null
toe 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 exists
afgedrukt, bijvoorbeeld:
./check.sh rabbitmq:3.4.4
Als je het gebruikt voor een niet-bestaande afbeelding en tag, wordt doesn't exist
afgedrukt, 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_build
dus dat het de nodige controles uitvoert voordat het originele docker build
commando 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