특정 태그를 가진 도커 이미지가 로컬에 존재하는지 확인하는 방법
특정 태그가 부착된 도커 이미지가 로컬에 존재하는지 알고 싶습니다.도커 클라이언트가 네이티브로 이 작업을 수행할 수 없는 경우 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이 아닙니다).
- 그
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
'programing' 카테고리의 다른 글
SQL SERVER 데이터베이스의 모든 테이블에 대한 행 수를 가져오는 방법 (0) | 2023.04.18 |
---|---|
목적에서 예외를 두는 것 (0) | 2023.04.13 |
Visual Studio 2017 - 표현 상호작용은 어떻게 되었습니까? (0) | 2023.04.13 |
문자열이 숫자(플로트 또는 int)를 나타내는지 확인하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
Markdown에서 'target="_blank'로 링크를 만들 수 있습니까? (0) | 2023.04.13 |