programing

특정 태그를 가진 도커 이미지가 로컬에 존재하는지 확인하는 방법

padding 2023. 4. 13. 20:40
반응형

특정 태그를 가진 도커 이미지가 로컬에 존재하는지 확인하는 방법

특정 태그가 부착된 도커 이미지가 로컬에 존재하는지 알고 싶습니다.도커 클라이언트가 네이티브로 이 작업을 수행할 수 없는 경우 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

보통 다음 결과를 테스트합니다(이 스크립트에서와 같음).

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

Powershell에 대해서(Garret Wilson코멘트):

if (!(docker images -q myimage:mytag 2> $null)) { 
  # do something
}

단,파라미터로만 받아들이기 때문에 를 사용하지 않고 태그에 grep을 붙여야 합니다.

docker images 태그 취득(도커 1.8+)[REPOSITORY[:TAG]]

다음에 설명하는 다른 방법은 도커 검사를 사용하는 것입니다.
그러나 도커 17+에서는 이미지의 구문은 다음과 같습니다(이미지가 존재하지 않는 경우 종료 상태는 0이 아닙니다).

iTayb코멘트에서 지적한 바와 같이:

  • docker images -q이미지가 많은 기계에서는 방법이 매우 느려질 수 있습니다.6,500개의 이미지 머신에서 동작하려면 44초 걸립니다.
  • docker image inspect가 즉시 반환됩니다.

Henry Blys의 코멘트에서 언급한 바와 같이:

사용하시는 경우docker image inspect my_image:my_tag출력을 무시하려면 , 를 추가합니다.--format="ignore me"문자 그대로 출력해 줄 거예요

또한 stdout을 리다이렉트하려면>/dev/null그러나 스크립트로 그렇게 할 수 없는 경우 포맷옵션은 정상적으로 동작합니다.

해라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/

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

[ -n "$(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

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

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

「」를 사용합니다.test

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

또는 한 줄로

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

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"

위의 @rubicks의 답변에서 영감을 받았습니다.

이미지가 이미 존재하는지 확인하려면

image_name_tag="alpine:3.13.3"

docker image inspect ${image_name_tag} > /dev/null
echo $?

이미지가 없는 경우 꺼내기

docker image inspect ${image_name_tag} > /dev/null || docker  pull ${image_name_tag}

데모 실행

# image_name_tag="alpine:3.13.3"
# 
# docker image inspect ${image_name_tag} > /dev/null
echo $?
Error: No such image: alpine:3.13.3
# echo $?
1
# docker image inspect ${image_name_tag} > /dev/null || docker  pull ${image_name_tag}
Error: No such image: alpine:3.13.3
3.13.3: Pulling from library/alpine
9aae54b2144e: Pull complete 
Digest: sha256:826f70e0ac33e99a72cf20fb0571245a8fee52d68cb26d8bc58e53bfa65dcdfa
Status: Downloaded newer image for alpine:3.13.3
docker.io/library/alpine:3.13.3
# docker image inspect ${image_name_tag} > /dev/null || docker  pull ${image_name_tag}
$ 

아주 좋은 독자들에게는 조금이나마 전해드리겠습니다.

빌드

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

특정 태그 이름의 경우

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

like 절의 경우 tagname: my_image_tag --> my_ima 시작*

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

예를 들어 "이미지"를 원하는 경우 "my_ima"에서 시작된 모든 이미지 태그를 삭제하십시오.

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')

은 메메, - the·메·메· the· the· the· the· the· the· the· the· the· the· the· 에 실장해야 생각한다.docker build명령어(플래그 사용?)를 사용하여 많은 코드 중복을 방지합니다.

라고 하는 래퍼 기능 안에서, 받아들여진 회답과 같은 조건을 사용했습니다.docker_build에 필요한 .docker build명령어를 입력합니다.

# Usage: docker_build <...> (instead of docker build)

docker_build()
{
    local arguments=("$@")
    local index
    for (( index=0; index<$#; index++ )); do
        case ${arguments[index]} in
            --tag)
                local tag=${arguments[index+1]}
                if [[ ! -z $(docker images -q "${tag}" 2> /dev/null) ]]; then
                    echo "Image ${tag} already exists."
                    return
                fi
                ;;
        esac
    done
    command docker build "$@"
}

면책사항:긴 형식의 공백으로 구분된 인수와 함께만 작동하므로 프로덕션 준비가 되지 않았습니다.--tag hello-world:latest 「 」, 「 」, 「 」, 「R&D」, 「R&D」를 만 하면 docker build명령어만, 다른 모든 명령어는 동일합니다.개선 사항이 있으면 알려주세요.

코드 반복을 피하기 위해 standard-commands-in-bash-functions를 래핑하는 아이디어가 래퍼 문장을 작성하는 것보다 더 우아하고 확장성이 있어 보였기 때문에 이 스니펫을 공유하고 싶었습니다.

나는 이것이 간결하고 적절한 의미론을 가지고 있기 때문에 좋아한다.이미지가 존재한다면 무엇이 더 쉬울까요?

if [ $(docker image ls ${build_env} --format="true") ] ; 
then
 echo "does exist"
fi

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

반응형