[bash] 특정 태그가있는 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이 아닙니다. )

댓글 에서 iTayb 가 언급했듯이 :

  • docker images -q방법은 이미지가 많은 컴퓨터에서 정말 느려질 수 있습니다. 6,500 개의 이미지 머신에서 실행하는 데 44 초가 걸립니다.
  • docker image inspect즉시 돌아갑니다.

답변

보십시오 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


답변

도커 레지스트리에서 도커 이미지를 검색하려는 경우 도커 이미지가 있는지 확인하는 가장 쉬운 방법은 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"}}]} 

그러면 이미지가 존재하지 않는다는 것을 확실히 알 수 있습니다.