Làm cách nào để kiểm tra xem hình ảnh Docker với một thẻ cụ thể có tồn tại cục bộ hay không?


117

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 ổn bằng cách sử dụng tập lệnh bash nếu ứng dụng khách Docker không thể thực hiện điều này nguyên bản.

Chỉ để cung cấp một số gợi ý cho một tập lệnh bash tiềm năng, kết quả của việc chạy docker imageslệnh sẽ 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

Câu trả lời:


159

Tôi thường kiểm tra kết quả của docker images -q(như trong tập lệnh này ):

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

Nhưng docker imageschỉ nhận REPOSITORYlàm tham số, bạn sẽ cần phải ghi trên thẻ mà không cần sử dụng-q.

docker images lấy thẻ ngay bây giờ (docker 1.8+) [REPOSITORY[:TAG]]

Cách tiếp cận khác được đề cập dưới đây là sử dụng thanh tra docker .
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, trạng thái thoát sẽ là khác 0 )

Theo ghi nhận của iTayb trong phần bình luận :

  • Các docker images -qphương pháp có thể nhận được rất chậm trên một máy với rất nhiều hình ảnh. Mất 44 giây để chạy trên máy 6.500 hình ảnh.
  • Lợi docker image inspectnhuận ngay lập tức.

1
Hmm không chắc liệu điều này có hiệu quả với thẻ không? Khi tôi thực hiện "docker images -q Rabbitmq", nó sẽ trả về "e8e654c05c91 và a4fbaad9f996" nhưng nếu tôi thực hiện "docker images -q Rabbitmq: 3.4.4" thì không có gì được trả lại mặc dù thẻ tồn tại.
Johan

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

@Johan Tôi vừa kiểm tra kỹ, và thông số hình ả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 một giải pháp thay thế.
VonC

1
Cảm ơn mà có vẻ hiệu quả. Nhưng có lẽ bạn nên chỉnh sửa câu trả lời của mình và xóa ": mytag" khỏi "myimage: mytag" trước khi tôi chấp nhận?
Johan

cho người mới: sự khác nhau giữa hình ảnh (myimage) và thẻ (mytag) là gì? tại sao myimage: mytag thay vì chỉ mytag?
Alexander Mills

37

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 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à nó ở định dạng json đẹp.


6
Đây là câu trả lời kịch bản nhất.
Michael Cole

2
Trên thực tế, imagespscác lệnh luôn luôn thoát với 0, với inspectnó đơn giản như:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg

docker inspecttuyệt vời vì mã trả về khác 0 khi không có hình ảnh nào tồn tại.
cowlinator

Điều này cũng nhanh hơn nhiều sau đó docker images -q.
iTayb

26

tldr:

docker image inspect myimage:mytag

Bằng cách chứng minh ...

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

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

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

Tài liệu tham khảo:

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


điều này rất đơn giản, nhanh chóng và tương thích trong tương lai. Tôi sẽ tuân theo giải pháp này.
MarAvFe

17

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

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

Hoặc là:

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

6
Không làm việc, trên hệ điều hành MacOS ít nhất, giá trị trả về luôn là 0.
Gabor Csardi

1
Mã này chính xác và hoạt động trên linux. Chỉ có điều tôi muốn thêm là dấu ngoặc kép để lệnh subshell
Draiken

3

Với sự trợ giúp của câu trả lời của Vonc ở trên, tôi đã tạo tập lệnh bash sau có 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 hình ảnh hiện có và thẻ sẽ in exists, ví dụ:

./check.sh rabbitmq:3.4.4

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

./check.sh rabbitmq:3.4.3

2

Sử dụng test

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

hoặc trong một dòng

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

2

Trong trường hợp bạn đang cố gắng tìm kiếm hình ảnh docker từ sổ đăng ký docker, tôi đoán cách dễ nhất để kiểm tra xem hình ảnh docker có xuất hiện hay không là sử dụng dịch vụ danh sách Thẻ API REST của Docker V2

Thí dụ:-

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

nếu kết quả trên trả về 200Ok với một danh sách các thẻ hình ảnh, thì chúng ta biết rằng hình ảnh đó tồn tại

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

khác nếu bạn thấy một cái gì đó giống như

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

thì bạn biết chắc rằng hình ảnh đó không tồn tại.


2

Trong tập lệnh bash, tôi thực hiện việc này để kiểm tra xem hình ảnh có tồn tại hay không bằng thẻ:

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

Tập lệnh ví dụ ở trên kiểm tra xem hình ảnh mysql với thẻ 5.6 có tồn tại hay không. Nếu bạn muốn chỉ cần kiểm tra xem có bất kỳ hình ảnh mysql nào tồn tại mà không có phiên bản cụ thể hay không thì chỉ cần chuyển tên kho lưu trữ không có thẻ như sau:

IMAGE_NAME="mysql"

0

Chỉ một chút từ tôi đến những độc giả rất tốt:

Xây dựng

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

Đồng hồ đeo tay

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

Chạy

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

0

cho tên thẻ cụ thể

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

cho "mệnh đề thích" tagname: my_image_tag -> start my_ima *

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

nếu bạn muốn một số "hình ảnh", ví dụ như xóa tất cả hình ảnh thẻ bắt đầu "my_ima", hãy thử điều này

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.