Як перевірити, чи існує зображення Docker із певним тегом локально?


116

Я хотів би дізнатися, чи існує локальне зображення Docker із певним тегом. Я добре, використовуючи bash-скрипт, якщо клієнт Docker не може цього зробити на самому собі.

Просто щоб надати деякі підказки для потенційного скрипта bash, результат виконання 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

Відповіді:


159

Я зазвичай перевіряю результат docker images -q(як у цьому сценарії ):

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

Але оскільки docker imagesприймає лише REPOSITORYяк параметр, вам потрібно буде промальовувати тег, не використовуючи-q.

docker images бере теги зараз (docker 1.8+) [REPOSITORY[:TAG]]

Інший підхід, згаданий нижче, - використовувати перевірку докера .
Але для docker 17+ синтаксис зображень такий: docker image inspect(для неіснуючого зображення статус виходу буде не-0 )

Як зазначив iTayb у коментарях :

  • docker images -qМетод може отримати дуже повільно на машині з великою кількістю зображень. На машині з 6500 зображеннями потрібно 44 секунди.
  • В docker image inspectповертається негайно.

1
Хм не впевнений, чи працює це для тегів? Коли я роблю "docker images -q rabbitmq", він повертає "e8e654c05c91 та a4fbaad9f996", але якщо я роблю "docker images -q rabbitmq: 3.4.4", нічого не повертається, хоча тег існує.
Йоган

@Johan Хоча тег існує локально?
VonC

@Johan Я лише двічі перевірив, і параметр docker images дійсно приймає лише репо, а не тег. Я відредагував відповідь, щоб запропонувати альтернативне рішення.
VonC

1
Дякую, що, здається, працює. Але, можливо, ви повинні відредагувати свою відповідь і видалити ": mytag" з "myimage: mytag", перш ніж я прийму її?
Йоган

для новобранців: чим відрізняється зображення (myimage) від тегу (mytag)? чому myimage: mytag замість просто mytag?
Олександр Міллс

36

Спробуйте 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.


6
Це найяскравіша відповідь.
Майкл Коул

2
Дійсно, imagesі psкоманди завжди виходять з 0, і inspectце так просто, як:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Ерік Данненберг,

docker inspectчудово через ненульовий код повернення, коли зображення не існує.
ковбасник

Це також значно швидше docker images -q.
iTayb

26

tldr:

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: busybox@sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f

$ docker image inspect busybox:latest >/dev/null 2>&1 && echo yes || echo no
no

Довідка:

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


це було просто, швидко та сумісно до майбутнього. Я буду дотримуватися цього рішення.
MarAvFe

17

Ви можете використовувати наступне:

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

Або:

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

6
Не працює, принаймні, на macOS повернене значення завжди дорівнює 0.
Gabor Csardi

1
Код правильний і працює на Linux. Єдине, що я б додав, - це цитати до команди
підключення

3

За допомогою вищевказаної відповіді Вонка я створив наступний сценарій bash 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

2

Використання test

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

або в одному рядку

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

2

Якщо ви намагаєтеся шукати зображення докера з реєстру докера, я думаю, найпростіший спосіб перевірити наявність зображення докера - скористатися послугою списку тегів Docker V2 REST API Теги

Приклад: -

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"}}]} 

то ви точно знаєте, що зображення не існує.


2

У скрипті bash я це роблю, щоб перевірити, чи існує зображення за тегом:

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

Приклад скрипту вище перевіряє, чи існує файл mysql з тегом 5.6. Якщо ви хочете просто перевірити, чи існує будь-яке зображення mysql без конкретної версії, просто передайте ім'я сховища без тегу так:

IMAGE_NAME="mysql"

0

Трохи від мене до дуже хороших читачів:

Побудувати

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

0

для конкретного імені тегу

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

для тегу "як пункт": my_image_tag -> запустити my_ima *

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

якщо ви хочете колись "зображення", наприклад, видалити всі зображення тегу, розпочатого "my_ima", спробуйте це

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.