วิธีตรวจสอบว่ามีอิมเมจ Docker พร้อมแท็กเฉพาะอยู่ในเครื่องหรือไม่?


117

ฉันต้องการทราบว่ามีอิมเมจ Docker ที่มีแท็กเฉพาะอยู่ในเครื่องหรือไม่ ฉันสบายดีโดยใช้สคริปต์ทุบตีหากไคลเอนต์ Docker ไม่สามารถทำสิ่งนี้ได้

เพียงเพื่อให้คำแนะนำสำหรับสคริปต์ทุบตีที่เป็นไปได้ผลลัพธ์ของการรัน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

คำตอบ:


161

ฉันมักจะทดสอบผลลัพธ์ของdocker images -q(ดังในสคริปต์นี้ ):

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

แต่ เนื่องจากdocker imagesใช้REPOSITORYเป็นพารามิเตอร์เท่านั้นคุณจะต้อง grep บนแท็กโดยไม่ต้องใช้-q.

docker images รับแท็กทันที (นักเทียบท่า 1.8+) [REPOSITORY[:TAG]]

วิธีการอื่น ๆ ที่ระบุไว้ด้านล่างคือการใช้นักเทียบท่าตรวจสอบ
แต่ด้วยนักเทียบท่า 17+ ไวยากรณ์สำหรับรูปภาพคือ: docker image inspect(บนรูปภาพที่ไม่มีอยู่จริงสถานะการออกจะเป็นไม่ใช่-0 )

ตามที่ระบุไว้โดยiTaybในความคิดเห็น :

  • docker images -qวิธีการจะได้รับช้าจริงๆบนเครื่องที่มีจำนวนมากของภาพ ใช้เวลา 44 วินาทีในการรันบนเครื่องรูปภาพ 6,500 ภาพ
  • docker image inspectผลตอบแทนทันที

1
อืมไม่แน่ใจว่าใช้ได้กับแท็กไหม เมื่อฉันทำ "docker images -q rabbitmq" มันจะส่งคืน "e8e654c05c91 และ a4fbaad9f996" แต่ถ้าฉันทำ "docker images -q rabbitmq: 3.4.4" จะไม่มีการส่งคืนแม้ว่าจะมีแท็กอยู่ก็ตาม
โยฮัน

@ โจฮันแม้ว่าแท็กจะมีอยู่ในพื้นที่?
VonC

@ โจฮันฉันเพิ่งตรวจสอบอีกครั้งและพารามิเตอร์ภาพนักเทียบท่าใช้เวลา repo เท่านั้นไม่ใช่แท็ก ฉันได้แก้ไขคำตอบเพื่อเสนอทางเลือกอื่น
VonC

1
ขอบคุณที่ดูเหมือนจะได้ผล แต่บางทีคุณควรแก้ไขคำตอบและนำ ": mytag" ออกจาก "myimage: mytag" ก่อนที่จะยอมรับ
โยฮัน

สำหรับมือใหม่: อะไรคือความแตกต่างระหว่างรูปภาพ (myimage) และแท็ก (mytag)? ทำไม myimage: mytag แทนที่จะเป็นแค่ mytag?
Alexander Mills

37

ลอง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
นี่คือคำตอบที่เป็นสคริปต์ที่สุด
Michael Cole

2
อันที่จริงimagesและpsคำสั่งจะออกด้วย 0 เสมอโดยinspectง่ายเหมือน:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg

docker inspectดีมากเนื่องจากโค้ดส่งคืนที่ไม่ใช่ศูนย์เมื่อไม่มีรูปภาพ
cowlinator

นอกจากนี้ยังเร็วกว่า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 สิ่งเดียวที่ฉันเพิ่มคือเครื่องหมายคำพูดในคำสั่ง subshell
Draiken

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

การใช้ 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

ในสคริปต์ทุบตีฉันทำสิ่งนี้เพื่อตรวจสอบว่ามีภาพโดยแท็ก:

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'

สำหรับ "like clause" 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*')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.