Programing

특정 태그가있는 Docker 이미지가 로컬에 있는지 확인하는 방법은 무엇입니까?

lottogame 2020. 9. 11. 19:27
반응형

특정 태그가있는 Docker 이미지가 로컬에 있는지 확인하는 방법은 무엇입니까?


특정 태그가있는 Docker 이미지가 로컬에 있는지 확인하고 싶습니다. Docker 클라이언트가 기본적으로이 작업을 수행 할 수없는 경우 bash 스크립트를 사용해도 괜찮습니다.

잠재적 인 bash 스크립트에 대한 몇 가지 힌트를 제공하기 위해 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

나는 일반적으로 docker images -q( 이 스크립트 에서와 같이) 의 결과를 테스트합니다 .

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

그러나 이후 docker images에만 걸리는 REPOSITORY매개 변수로, 당신은 사용하지 않고, 태그에 grep으로해야합니다-q.

docker images 지금 태그 가져 오기 (docker 1.8+) [REPOSITORY[:TAG]]

아래 언급 된 다른 접근 방식은 docker inspect 를 사용하는 것 입니다.
그러나 docker 17+의 경우 이미지 구문은 다음과 같습니다. docker image inspect(존재하지 않는 이미지에서 종료 상태는 0이 아닙니다. )


보십시오 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 형식입니다.


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/


다음과 같이 사용할 수 있습니다.

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

또는:

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

Vonc 답변 의 도움으로 다음과 같은 bash 스크립트를 만들었습니다 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

사용 test

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

또는 한 줄로

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

In case you are trying to search for a docker image from a docker registry, I guess the easiest way to check if a docker image is present is by using the Docker V2 REST API Tags list service

Example:-

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

if the above result returns 200Ok with a list of image tags, then we know that image exists

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

else if you see something like

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

then you know for sure that image doesn't exist.


Just a bit from me to very good readers:

Build

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

Watch

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

Run

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

참고URL : https://stackoverflow.com/questions/30543409/how-to-check-if-a-docker-image-with-a-specific-tag-exist-locally

반응형