Как проверить, существует ли изображение Docker с определенным тегом локально?
Я хотел бы узнать, существует ли локальное изображение Docker с определенным тегом. Я в порядке, используя bash script, если клиент Docker не может сделать это изначально.
Чтобы дать некоторые подсказки для потенциального bash script, результат выполнения команды docker images
возвращает следующее:
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
Ответы
Ответ 1
Обычно я тестирую результат docker images -q
(как в this script):
if [[ "$(docker images -q myimage:mytag 2> /dev/null)" == "" ]]; then
# do something
fi
Но , поскольку docker images
принимает только параметр REPOSITORY
в качестве параметра, вам нужно будет использовать grep on tag без использования -q
.
docker images
теперь принимает теги (docker 1.8+) [REPOSITORY[:TAG]]
Другим подходом, упомянутым ниже, является использование докерера.
Но с докером 17+ синтаксис для изображений: docker image inspect
(на несуществующем изображении, статус выхода будет не 0)
Ответ 2
Попробуйте docker inspect
, например:
$ docker inspect --type=image treeder/hello.rb:nada
Error: No such image: treeder/hello.rb:nada
[]
Но теперь с изображением, которое существует, вы получите кучу информации, например:
$ docker inspect --type=image treeder/hello.rb:latest
[
{
"Id": "85c5116a2835521de2c52f10ab5dda0ff002a4a12aa476c141aace9bc67f43ad",
"Parent": "ecf63f5eb5e89e5974875da3998d72abc0d3d0e4ae2354887fffba037b356ad5",
"Comment": "",
"Created": "2015-09-23T22:06:38.86684783Z",
...
}
]
И это в хорошем json формате.
Ответ 3
Вы можете использовать следующее:
[ ! -z $(docker images -q someimage:sometag) ] || echo "does not exist"
Или:
[ -z $(docker images -q someimage:sometag) ] || echo "already exists"
Ответ 4
TL;DR:
docker image inspect myimage:mytag
В порядке демонстрации...
Успех, найдено изображение:
$ 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
ошибка, отсутствующее изображение:
$ docker image rm busybox:latest
Untagged: busybox:latest
Untagged: [email protected]:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f
$ docker image inspect busybox:latest >/dev/null 2>&1 && echo yes || echo no
no
Ссылка:
https://docs.docker.com/engine/reference/commandline/image_inspect/
Ответ 5
С помощью Vonc answer выше я создал следующий bash script с именем 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
Используя его для существующего изображения и тега, напечатайте exists
, например:
./check.sh rabbitmq:3.4.4
Используя его для несуществующего изображения и тега, напечатайте doesn't exist
, например:
./check.sh rabbitmq:3.4.3
Ответ 6
Используя test
if test ! -z "$(docker images -q <name:tag>)"; then
echo "Exist"
fi
или в одну строку
test ! -z "$(docker images -q <name:tag>)" && echo exist
Ответ 7
В случае, если вы пытаетесь найти образ докера в реестре докеров, я думаю, что самый простой способ проверить, присутствует ли образ докера, - использовать сервис списка тегов REST API Docker V2
Пример:-
curl $CURLOPTS -H "Authorization: Bearer $token" "https://hub.docker.com:4443/v2/your-repo-name/tags/list"
если приведенный выше результат возвращает 200Ok со списком тегов изображения, то мы знаем, что изображение существует
{"name":"your-repo-name","tags":["1.0.0.1533677221","1.0.0.1533740305","1.0.0.1535659921","1.0.0.1535665433","latest"]}
иначе, если вы видите что-то вроде
{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"your-repo-name"}}]}
тогда вы точно знаете, что изображение не существует.
Ответ 8
Немного от меня до очень хороших читателей:
строить
#!/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
Часы
docker logs --tail 50 --follow --timestamps smpp-gateway
Бежать
sudo docker exec -it \
$(sudo docker ps | grep "smpp-gateway:latest" | cut -d " " -f1) \
/bin/bash