यह कैसे जांचें कि क्या स्थानीय टैग के साथ डॉक की छवि स्थानीय रूप से मौजूद है?


116

मुझे यह पता लगाना है कि क्या किसी विशिष्ट टैग के साथ डॉक की छवि स्थानीय रूप से मौजूद है। अगर एक डॉक ग्राहक मूल रूप से ऐसा नहीं कर सकता है तो मैं एक बैश स्क्रिप्ट का उपयोग करके ठीक हूं।

बस एक संभावित बैश स्क्रिप्ट के लिए कुछ संकेत प्रदान करने के लिए 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विधि छवियों के बहुत सारे के साथ एक मशीन पर वास्तव में धीमी गति से मिल सकती है। 6,500 इमेज मशीन पर चलने के लिए 44 सेकंड लगते हैं।
  • docker image inspectतुरंत लौट जाता है।

1
अगर हम टैग्स के लिए काम करते हैं तो Hmm को यकीन नहीं है? जब मैं "docker images -q rabbitmq" करता हूं तो यह "e8e654c05c91 और a4fbaad9f996" देता है, लेकिन यदि मैं "docker images -q rabbitmq: 3.4.4" करता हूं, तो टैग मौजूद होने के बावजूद कुछ भी नहीं लौटाया जाता है।
जोहान

@ जोहान भले ही टैग स्थानीय रूप से मौजूद हो?
वॉन

@ जोहान मैं सिर्फ डबल-चेक किया गया है, और डॉकटर इमेज पैरामीटर वास्तव में केवल रेपो लेता है, टैग नहीं। मैंने वैकल्पिक समाधान के प्रस्ताव का उत्तर संपादित किया है।
वॉनसी

1
धन्यवाद जो काम करने लगता है। लेकिन शायद आपको अपना जवाब संपादित करना चाहिए और इसे स्वीकार करने से पहले "mytag: mytag" से ": mytag" को हटा देना चाहिए?
जोहान

newbs के लिए: एक छवि (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/


यह भविष्य के लिए सीधा, त्वरित और संगत था। मैं इस समाधान के लिए छड़ी हूँ।
23

17

आप निम्नलिखित की तरह उपयोग कर सकते हैं:

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

या:

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

6
कम से कम,
macOS

1
कोड सही है और लिनक्स पर काम करता है। केवल एक चीज जो मैं
जोड़ूंगा,

3

ऊपर Vonc के उत्तर की सहायता से मैंने निम्नलिखित बैश स्क्रिप्ट का नाम बनाया 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

यदि आप डॉक रजिस्ट्री से एक डॉकटर छवि के लिए खोज करने का प्रयास कर रहे हैं, तो मुझे लगता है कि डॉकर 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"}}]} 

तब आपको पता है कि छवि मौजूद नहीं है।


2

बैश स्क्रिप्ट में मैं यह जांचने के लिए करता हूं कि क्या टैग द्वारा छवि मौजूद है:

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

उदाहरण के ऊपर स्क्रिप्ट चेक करता है कि 5.6 टैग के साथ mysql छवि मौजूद है या नहीं। यदि आप चाहते हैं कि यदि कोई विशिष्ट संस्करण के बिना कोई 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

Daud

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

0

विशिष्ट टैग नाम के लिए

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

"लाइक क्लॉज" के लिए tagname: my_image_tag -> start my_ima *

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

अगर आप उदाहरण के लिए "इमेज" को "इमेज" डिलीट करना चाहते हैं, तो "my_ima" यह कोशिश करें

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.