2015-05-30 12 views
39

Tôi muốn tìm hiểu xem hình ảnh Docker với một thẻ cụ thể có tồn tại cục bộ hay không. Tôi tốt bằng cách sử dụng một kịch bản bash nếu khách hàng Docker không thể làm điều này nguyên bản.Làm thế nào để kiểm tra xem một hình ảnh Docker với một thẻ cụ thể tồn tại cục bộ?

Chỉ cần để cung cấp một số gợi ý cho một kịch bản bash tiềm năng là kết quả của cách chạy lệnh docker images trả về như sau:

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 

Trả lời

65

tôi thường kiểm tra kết quả của docker images -q (như trong this script):

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

Nhưng từ docker images chỉ mất REPOSITORY làm thông số, bạn sẽ cần phải grep trên thẻ, mà không cần sử dụng -q .

docker images mất thẻ bây giờ (Docker 1.8+) [REPOSITORY[:TAG]]

Phương pháp khác được đề cập dưới đây là sử dụng docker inspect.
Nhưng với Docker 17+, cú pháp cho hình ảnh là: docker image inspect (trên một hình ảnh không tồn tại, các exit status will be non-0)

+0

Hmm không chắc chắn nếu làm việc này cho thẻ? Khi tôi làm "hình ảnh docker -q thỏmq" nó trả về "e8e654c05c91 và a4fbaad9f996" nhưng nếu tôi làm "hình ảnh docker -q rabbitmq: 3.4.4" không có gì được trả lại ngay cả khi thẻ tồn tại. – Johan

+0

@Johan Mặc dù thẻ tồn tại cục bộ? – VonC

+0

@Johan Tôi chỉ cần kiểm tra kỹ, và thông số hình ảnh của trình docker thực sự chỉ lấy repo chứ không phải thẻ. Tôi đã chỉnh sửa câu trả lời để đề xuất giải pháp thay thế. – VonC

1

Với sự giúp đỡ của Vonc's answer trên, chúng tôi đã tạo ra kịch bản bash sau tên 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 

Sử dụng nó cho một hình ảnh và thẻ hiện có sẽ in exists, ví dụ:

./check.sh rabbitmq:3.4.4 

Sử dụng nó cho một hình ảnh và thẻ không tồn tại sẽ in doesn't exist, ví dụ:

./check.sh rabbitmq:3.4.3 
13

Hãy thử docker inspect, ví dụ:

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

Nhưng bây giờ với một hình ảnh mà tồn tại, bạn sẽ nhận được một loạt thông tin, ví dụ:

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

Và ở định dạng json đẹp.

+2

Đây là câu trả lời dễ đọc nhất. –

+1

Thật vậy, các lệnh 'images' và' ps' luôn thoát với 0, với 'kiểm tra' nó đơn giản như:' docker inspection "$ {image_id}: $ {image_tag}">/dev/null 2> & 1 || echo "không tồn tại!" ' –

7

Bạn có thể sử dụng như sau:

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

Hoặc:

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

Không hoạt động, trên macOS ít nhất, giá trị trả về luôn là 0. –

+1

Mã đúng và hoạt động trên linux. Điều duy nhất tôi muốn thêm là báo giá cho lệnh subshell – Draiken

5

TLDR:

docker image inspect myimage:mytag 

Bằng cách trình diễn ...

thành công, tìm thấy hình ảnh:

$ 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 

thất bại, thiếu hình ảnh:

$ 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 

tham khảo:

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

Các vấn đề liên quan