bash - studio - ¿Cómo verificar si una imagen de Docker con una etiqueta específica existe localmente?
visual studio installer (8)
Me gustaría saber si una imagen de Docker con una etiqueta específica existe localmente. Estoy bien usando un script bash si el cliente Docker no puede hacer esto de forma nativa.
Solo para proporcionar algunas sugerencias para un script de bash potencial, el resultado de ejecutar el comando
docker images
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
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
Usarlo para una imagen existente y la etiqueta imprimirá
exists
, por ejemplo:
./check.sh rabbitmq:3.4.4
Usarlo para una imagen no existente y la etiqueta se imprimirá
doesn''t exist
, por ejemplo:
./check.sh rabbitmq:3.4.3
En caso de que esté tratando de buscar una imagen de acoplador desde un registro de acoplador, creo que la forma más fácil de verificar si hay una imagen de acoplador es mediante el servicio de lista de etiquetas 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 ves algo como
{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"your-repo-name"}}]}
entonces sabes con seguridad que la imagen no existe.
Por lo general, pruebo el resultado de las
docker images -q
del
docker images -q
(como en
este script
):
if [[ "$(docker images -q myimage:mytag 2> /dev/null)" == "" ]]; then
# do something
fi
Pero
.
docker images
solo toman
REPOSITORY
como parámetro, necesitaría grep en la etiqueta, sin usar
-q
docker images
Docker ahora toman etiquetas (docker 1.8+)
[REPOSITORY[:TAG]]
El otro enfoque mencionado a continuación es usar
Docker Inspect
.
Pero con docker 17+, la sintaxis de las imágenes es:
docker image inspect
(en una imagen inexistente, el
estado de salida será distinto de 0
)
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á un montón de 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 buen formato json.
Puedes usar lo siguiente:
$ 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
O:
$ 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
Solo 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
Usando
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
tldr:
[ ! -z $(docker images -q someimage:sometag) ] || echo "does not exist"
A modo de demostración ...
éxito, imagen encontrada:
[ -z $(docker images -q someimage:sometag) ] || echo "already exists"
falla, falta imagen:
docker image inspect myimage:mytag
Referencia:
https://docs.docker.com/engine/reference/commandline/image_inspect/