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


116

특정 태그가있는 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

답변:


159

나는 일반적으로 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즉시 돌아갑니다.

1
이것이 태그에서 작동하는지 확실하지 않습니까? "docker images -q rabbitmq"를 수행하면 "e8e654c05c91 및 a4fbaad9f996"이 반환되지만 "docker images -q rabbitmq : 3.4.4"를 수행하면 태그가 존재하더라도 아무 것도 반환되지 않습니다.
Johan

@Johan 태그가 로컬에 존재하더라도?
VonC 2015 년

@Johan 방금 다시 확인했으며 docker images 매개 변수는 실제로 태그가 아닌 repo 만 사용합니다. 대체 솔루션을 제안하기 위해 답변을 편집했습니다.
VonC 2015 년

1
작동하는 것 같아 감사합니다. 하지만 내가 수락하기 전에 대답을 편집하고 "myimage : mytag"에서 ": mytag"를 제거해야할까요?
Johan

newbs : 이미지 (myimage)와 태그 (mytag)의 차이점은 무엇입니까? mytag 대신 myimage : mytag가 필요한 이유는 무엇입니까?
Alexander Mills

36

보십시오 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
이것은 가장 스크립트 가능한 답변입니다.
마이클 콜

2
사실 imagesps함께 명령은 항상 0으로 종료 inspect가 단순하게있다 :docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
에릭 Dannenberg

docker inspect이미지가 없을 때 0이 아닌 리턴 코드로 인해 좋습니다.
cowlinator 2018

이것은 또한 훨씬 더 빠릅니다 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 2016

1
코드가 정확하고 Linux에서 작동합니다. 내가 추가 할 것 한가지는 서브 쉘 명령에 따옴표입니다
Draiken

3

위 의 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

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

bash 스크립트에서 이미지가 태그로 존재하는지 확인하기 위해 이렇게합니다.

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

위의 예제 스크립트는 5.6 태그가있는 mysql 이미지가 있는지 확인합니다. 특정 버전이없는 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'

for "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.