Belirli bir etikete sahip bir Docker görüntüsünün yerel olarak mevcut olup olmadığı nasıl kontrol edilir?


117

Belirli bir etikete sahip bir Docker görüntüsünün yerel olarak mevcut olup olmadığını öğrenmek istiyorum. Docker istemcisi bunu yerel olarak yapamazsa bir bash betiği kullanmakta sorun yok.

Olası bir bash betiği için bazı ipuçları sağlamak amacıyla, docker imageskomutu çalıştırmanın sonucu aşağıdakileri döndürür:

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

Yanıtlar:


160

Genellikle sonucunu test ederim docker images -q( bu komut dosyasındaki gibi ):

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

Fakat çünkü docker imagesyalnızca sürer REPOSITORYparametre olarak, kullanmakta olmadan etiketindeki grep gerekir-q.

docker images şimdi etiketleri alıyor (docker 1.8+) [REPOSITORY[:TAG]]

Aşağıda bahsedilen diğer yaklaşım, docker inspect kullanmaktır .
Ancak docker 17+ ile görüntülerin sözdizimi şöyledir: docker image inspect(var olmayan bir görüntüde çıkış durumu 0 olmayacaktır )

Tarafından belirtildiği gibi iTayb içinde yorumlarla :

  • docker images -qYöntem görüntüleri dolu bir makinede gerçekten yavaş alabilirsiniz. 6.500 görüntülü bir makinede çalıştırmak 44 saniye sürer.
  • docker image inspectHemen döner.

1
Bunun etiketler için çalışıp çalışmadığından emin değil misiniz? "Docker images -q rabbitmq" yaptığımda, "e8e654c05c91 ve a4fbaad9f996" döndürür, ancak "docker images -q rabbitmq: 3.4.4" yaparsam etiketi mevcut olsa bile hiçbir şey döndürülmez.
Johan

@Johan Etiket yerel olarak mevcut olsa bile?
VonC

@Johan Ben sadece iki kez kontrol ettim ve docker images parametresi gerçekten sadece repoyu alıyor, etiketi değil. Alternatif bir çözüm önermek için cevabı düzenledim.
VonC

1
Bu işe yarıyor gibi görünüyor. Ama belki de ben kabul etmeden önce cevabınızı düzenlemeli ve "myimage: mytag" dan ": mytag" i kaldırmalısınız?
Johan

yeniler için: bir görüntü (benimgörüntü) ile bir etiket (etiketim) arasındaki fark nedir? neden myimage: mytag yerine mytag?
Alexander Mills

37

docker inspectÖrneğin deneyin :

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

Ama şimdi var olan bir görselle bir sürü bilgi alacaksınız, örneğin:

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

Ve güzel bir json formatında.


6
Bu en kodlanabilir cevaptır.
Michael Cole

2
Nitekim imagesve pskomutlar her zaman 0 ile çıkar, inspectşu kadar basittir:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg

docker inspectgörüntü olmadığında sıfır olmayan dönüş kodu nedeniyle harika.
cowlinator

Bu da o zaman çok daha hızlı docker images -q.
iTayb

26

TLDR:

docker image inspect myimage:mytag

Gösteri yoluyla ...

başarı, bulunan görüntü:

$ 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

arıza, eksik görüntü:

$ 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

Referans:

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


bu basit, hızlı ve geleceğe uyumluydu. Bu çözüme bağlı kalacağım.
MarAvFe

17

Aşağıdaki gibi kullanabilirsiniz:

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

Veya:

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


1
Kod doğru ve linux üzerinde çalışıyor. Ekleyeceğim tek şey
subshell

3

Yukarıdaki Vonc cevabının yardımıyla , aşağıdaki bash komut dosyasını oluşturdum 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

Mevcut bir resim ve etiket için kullanmak exists, örneğin:

./check.sh rabbitmq:3.4.4

Mevcut olmayan bir resim ve etiket doesn't existiçin kullanmak, örneğin:

./check.sh rabbitmq:3.4.3

2

kullanma test

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

veya tek satırda

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

2

Bir docker kayıt defterinden bir docker görüntüsü aramaya çalışıyorsanız, bir docker görüntüsünün olup olmadığını kontrol etmenin en kolay yolu Docker V2 REST API Etiketleri listesi hizmetini kullanmaktır.

Misal:-

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

Yukarıdaki sonuç resim etiketleri listesiyle 200Ok değerini döndürürse, resmin var olduğunu biliyoruz

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

başka bir şey görürsen

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

o zaman o görüntünün var olmadığından emin olursunuz.


2

Bash komut dosyasında, görüntünün etikete göre var olup olmadığını kontrol etmek için bunu yapıyorum:

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

Yukarıdaki örnek komut dosyası, 5.6 etiketli mysql resminin mevcut olup olmadığını kontrol eder. Belirli bir sürümü olmayan herhangi bir mysql görüntüsünün var olup olmadığını kontrol etmek istiyorsanız, arşiv adını şu şekilde etiket olmadan iletin:

IMAGE_NAME="mysql"

0

Benden çok iyi okuyuculara birazcık:

İnşa etmek

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

İzlemek

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

Çalıştırmak

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

0

belirli etiket adı için

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

"like clause" tagname: my_image_tag -> my_ima'yı başlat *

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

Örneğin "resim" i istiyorsanız, "my_ima" ile başlatılan tüm resimleri silin

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.