programing

도커 레지스트리 v2에서 이미지 목록을 가져오는 방법

bestprogram 2023. 9. 4. 20:31

도커 레지스트리 v2에서 이미지 목록을 가져오는 방법

도커 레지스트리 v1을 사용하고 있으며 최신 버전인 v2로 마이그레이션하는 데 관심이 있습니다.그러나 레지스트리에 있는 이미지 목록을 가져올 방법이 필요합니다. 예를 들어 레지스트리 v1을 사용하여 GET 요청을 실행할 수 있습니다.http://myregistry:5000/v1/search?결과는 다음과 같습니다.

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "deis/router"
    },
    {
      "description": "",
      "name": "deis/database"
    }
  ]
}

하지만 는 공식 문서에서 레지스트리에 있는 이미지 목록과 비슷한 것을 찾을 수 없습니다.새 버전 v2에서 할 수 있는 방법 아는 사람?

레지스트리 V2의 최신 버전(2015-07-31 기준)의 경우 Docker에서 이미지를 얻을 수 있습니다.허브:

docker pull distribution/registry:master

모든 리포지토리 나열(효과적인 이미지):

curl -X GET https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

리포지토리에 대한 모든 태그 나열:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}

를 ""에서 .curl

curl -X GET -u <user>:<pass> https://myregistry:5000/v2/_catalog
curl -X GET -u <user>:<pass> https://myregistry:5000/v2/ubuntu/tags/list

검색할 수 있습니다.

http://<ip/hostname>:<port>/v2/_cisco

카탈로그 가져오기

기본적으로 레지스트리 api는 100개의 카탈로그 항목을 반환하며 코드는 다음과 같습니다.

레지스트리 api를 컬링하는 경우:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

다음과 같습니다.

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=100

이것은 페이지화 방법입니다.

항목의 합계가 100을 초과하는 경우 다음 두 가지 방법으로 수행할 수 있습니다.

번째: 더 큰 번호를 지정합니다.

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=2000

두 번째: 다음 링커 URL을 구문 분석

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

응답 헤더에 포함된 링크 요소:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

응답 헤더:

Link: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"

링크 요소에 이 요청의 마지막 항목이 있으면 다음 '페이지'를 요청할 수 있습니다.

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws

응답 헤더에 링크 요소가 포함된 경우 루프에서 이를 수행할 수 있습니다.

이미지 가져오기

카탈로그 결과는 다음과 같습니다.

{
   "repositories": [
      "busybox",
      "ceph/mds"
   ]
}

모든 카탈로그에서 이미지를 가져올 수 있습니다.

curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list

반환:

{"name":"busybox","tags":["latest"]}

https://github.com/docker/distribution 에서 제공되는 도커 레지스트리의 최신 버전은 Catalog API(v2/_http)를 지원합니다.이를 통해 리포지토리를 검색할 수 있습니다.

관심이 있다면 새로운 도커 레지스트리 배포판(https://github.com/vivekjuneja/docker_registry_cli) 에서 검색 기능을 쉽게 사용할 수 있도록 구축된 도커 이미지 레지스트리 CLI를 사용해 볼 수 있습니다.

이것은 저를 미치게 만들었지만, 저는 마침내 모든 조각들을 정리했습니다.2015년 1월 25일 기준으로 도커 V2 레지스트리에 이미지를 나열하는 것이 가능하다는 것을 확인했습니다(위에서 언급한 @jonatan과 정확히 일치함).

만약 제가 그것에 대한 평판이 있다면, 저는 그 대답에 찬성표를 던질 것입니다.

대신에, 저는 그 답에 대해 더 자세히 설명할 것입니다.레지스트리 V2는 보안을 염두에 두고 만들어졌으므로 자체 서명된 인증서로 설정하는 방법을 포함하고 해당 인증서로 https 호출을 수행할 수 있도록 컨테이너를 실행하는 것이 적절하다고 생각합니다.

레지스트리를 시작하는 데 실제로 사용하는 스크립트는 다음과 같습니다.

sudo docker stop registry
sudo docker rm -v registry
sudo docker run -d \
  -p 5001:5001 \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /root/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ 
  -e REGISTRY_HTTP_DEBUG_ADDR=':5001' \
  registry:2.2.1

어떤 사람들에게는 이것이 명백할 수도 있지만, 저는 항상 열쇠와 확실한 것들을 혼동합니다.**를 (는 제가 .crt를 @jonaton에 넣었기 때문입니다.)/root액세스할 수 있는 사용자 디렉토리에 복사본을 만들었습니다.)

curl --cacert ~/domain.crt https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

**위의 명령어가 변경되었습니다: -XGET은 제가 시도했을 때 실제로 작동하지 않았습니다.

참고:https://myregistry:5000(위와 같이) 생성된 인증서에 지정된 도메인과 일치해야 합니다.

우리는 이 목적을 위해 CLI 도구를 작성했습니다: docker-ls 도커 레지스트리를 탐색할 수 있으며 토큰 또는 기본 인증을 통한 인증을 지원합니다.

여기 Repos 및 관련 태그 목록을 인쇄할 수 있는 멋진 작은 라이너(JQ 사용)가 있습니다.

만약 당신이 가지고 있지 않다면.jq수 됨: 설되어사수있는항목:brew install jq

# This is my URL but you can use any
REPO_URL=10.230.47.94:443

curl -k -s -X GET https://$REPO_URL/v2/_catalog \
 | jq '.repositories[]' \
 | sort \
 | xargs -I _ curl -s -k -X GET https://$REPO_URL/v2/_/tags/list

레지스트리: 2.1.1 이상(여기서 마지막 레지스트리를 확인할 수 있음)을 설치하고 GET /v2/_catalog를 사용하여 목록을 가져옵니다.

https://github.com/docker/distribution/blob/master/docs/spec/api.md#listing-repositories

모든 이미지를 셸 스크립트별로 나열 예: https://gist.github.com/OndrejP/a2386d08e5308b0776c0

로컬 도커 저장소이기 때문에 로그인 세부 정보를 제공해야 한다는 점을 제외하고는 여기서 동일하게 작업해야 했습니다.

위와 같으나 URL에 사용자 이름/비밀번호를 제공합니다.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog

포맷되지 않은 JSON으로 돌아옵니다.

저는 사람이 읽기 쉽도록 파이썬 포맷터를 통해 파이프로 연결했습니다. 만약 당신이 이 포맷으로 그것을 가지고 싶어한다면요.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool

다음은 레지스트리에 있는 모든 이미지의 모든 태그를 나열하는 예제입니다.HTTP Basic 인증을 위해 구성된 레지스트리도 처리합니다.

THE_REGISTRY=localhost:5000

# Get username:password from docker configuration. You could
# inject these some other way instead if you wanted.
CREDS=$(jq -r ".[\"auths\"][\"$THE_REGISTRY\"][\"auth\"]" .docker/config.json | base64 -d)

curl -s --user $CREDS https://$THE_REGISTRY/v2/_catalog | \
    jq -r '.["repositories"][]' | \
    xargs -I @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

설명:

  • 사용자 이름 추출: .vmdker/config.json의 암호
  • 레지스트리에 https 요청을 하여 모든 "저장소"를 나열합니다.
  • json 결과를 리포지토리 이름의 플랫 목록으로 필터링
  • 각 리포지토리 이름:
  • 레지스트리에 https 요청을 하여 해당 "레지스트리"에 대한 모든 "디렉토리"를 나열합니다.
  • 개체의 결과 스트림을 필터링하여 각 리포지토리에서 발견된 각 태그에 대해 "저장소": "태그" 쌍을 인쇄합니다.

"/v2/_catalog" 및 "/tags/list" 끝점을 사용하면 모든 이미지를 나열할 수 없습니다.몇 개의 다른 이미지를 누르고 "최신" 태그를 지정하면 이전 이미지를 나열할 수 없습니다!다이제스트 "docker pull unbubuntu@sha256:ac13c5d2..."를 사용하여 참조하더라도 여전히 풀링할 수 있습니다. 따라서 답은 - 동일하지 않은 태그만 나열할 수 있는 이미지를 나열할 수 있는 방법이 없습니다.

저는 다양한 방법으로 이미지를 나열하는 사용하기 쉬운 명령줄 도구를 작성했습니다(예: 모든 이미지 나열, 해당 이미지의 모든 태그 나열, 해당 태그의 모든 계층 나열).

또한 단일 이미지의 오래된 태그만 삭제하거나 모든 이미지에서 삭제하는 등 다양한 방법으로 사용하지 않는 이미지를 삭제할 수 있습니다.CI 서버에서 레지스트리를 채우는 경우 최신/안정 버전만 유지하려는 경우에 편리합니다.

파이썬으로 작성되었으며 부피가 큰 커스텀 레지스트리 이미지를 다운로드할 필요가 없습니다.

만약 누군가가 여기까지 간다면요.

다른 사람들이 위에서 이미 말한 것을 받아들입니다.여기에 답을 형식이 지정된 텍스트 파일인 json에 입력하는 한 줄기가 있습니다.

curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst

이거 약간.

{
  "repositories": [
    "somerepo/somecontiner",
    "somerepo_other/someothercontiner",
 ...
  ]
}

컨테이너 수와 일치하도록 '?n=xxxx'를 변경해야 할 수도 있습니다.

다음은 오래된 용기와 사용하지 않은 용기를 자동으로 제거하는 방법입니다.

이 스레드는 오래 전으로 거슬러 올라가며, 고려해야 할 가장 최근의 도구는 및 입니다.

skopeo서명을 지원하며 다른 많은 기능이 있습니다.crane좀 더 미니멀리즘적이고 간단한 셸 스크립트 내에서 통합하는 것이 더 쉽다는 것을 알게 되었습니다.

도커 검색 레지스트리 v2 기능은 현재 이 글을 쓰는 시점에서 지원되지 않습니다.2015년 2월 이후의 토론 참조: "등록부 검색 기능 #discovery" https://github.com/docker/distribution/issues/206

저는 스크립트를 작성했습니다. view-private-details. https://github.com/BradleyA/Search-docker-registry-v2-script.1.0 은 예쁘지는 않지만 개인 레지스트리에서 필요한 정보를 얻을 수 있습니다.

view-private-registry의 출력 예:

$ view-private-registry`
busybox:latest
gcr.io/google_containers/etcd:2.0.9
gcr.io/google_containers/hyperkube:v0.21.2
gcr.io/google_containers/pause:0.8.0
google/cadvisor:latest
jenkins:latest
logstash:latest
mongo:latest
nginx:latest
python:2.7
redis:latest
registry:2.1.1
stackengine/controller:latest
tomcat:7
tomcat:latest
ubuntu:14.04.2
Number of images:   16
Disk space used:    1.7G    /mnt/three/docker-registry/registry-data

모든 이미지를 태그와 함께 나열하는 라이너 바시:

curl --user user:pass https://myregistry.com/v2/_catalog | jq .repositories | sed -n 's/[ ",]//gp' | xargs -L1 -IIMAGE curl -s --user user:pass https://myregistry.com/v2/IMAGE/tags/list | jq '. as $parent | .tags[] | $parent.name + ":" + . '

이미지 이름에서 검색할 두 줄:

search=my_container_part_name
curl --user user:pass https://registry.medworx.io/v2/_catalog | jq .repositories | sed -n '/'"$search"'/{s/[ ",]//gp;}' | xargs -L1 -IIMAGE curl -s --user user:pass https://registry.medworx.io/v2/IMAGE/tags/list | jq '. as $parent | .tags[] | $parent.name + ":" + . '

대체: user, pass 및 myregistry.com 를 적절히 사용합니다.

curl, sed, xargs, jq를 사용하며 이해하기 어렵습니다...하지만 그것은 효과가 있습니다.이미지당 한 통화 + 1을 생성합니다.

여기서 허용된 답변이 빈 줄만 반환하는 경우 레지스트리 서버의 ssl/tls 인증서 때문일 수 있습니다.--insecure 플래그를 사용합니다.

curl --insecure https://<registryHostnameOrIP>:5000/v2/_catalog

도커 레지스트리 컨테이너에 ssh 또는 연결할 수 있는 경우 파일 시스템을 탐색하여 다음과 같은 원하는 항목을 찾습니다.

kubectl exec -it docker-registry-0 -- /bin/sh

ls /var/lib/registry/docker/registry/v2/repositories
ls /var/lib/registry/docker/registry/v2/repositories/busybox/_manifests/tags/

다음은 자체 호스팅 레지스트리의 카탈로그 및 태그 목록을 보고 탐색하는 간단한 bash 스크립트입니다.레지스트리 도커 이미지에 노출된 API를 사용합니다.가지고 계신다면,jless설치되어 있어 보기가 조금 더 좋습니다.

#!/bin/bash
REGISTRY="https://my.registry.internal:5000"

curl -s GET $REGISTRY/v2/_catalog
echo "Enter name to get tags:"
read REPO

if command -v jless &> /dev/null
then
  curl -s GET $REGISTRY/v2/$REPO/tags/list | jless
else
  curl -s GET $REGISTRY/v2/$REPO/tags/list
fi

각 레지스트리는 컨테이너로 실행되므로 컨테이너 ID는 연결된 로그 파일 ID-json.log를 가집니다. 이 로그 파일에는 vars.name=[image] 및 vars.reference=[tag]가 포함됩니다.스크립트를 사용하여 이를 추정하고 인쇄할 수 있습니다.이 방법은 레지스트리 V2-2.0.1에 푸시된 이미지를 나열하는 방법 중 하나일 수 있습니다.

사용 사례에서 프로덕션용으로 서명된 이미지와 신뢰할 수 있는 이미지만 식별하는 경우 이 방법이 유용합니다.

모든 서명된 태그에 대한 도커 이미지 레포를 구문 분석하고 모든 JSON 형식을 제거하여 깨끗한 이미지 태그만 토해냅니다.물론 어떤 것이 당신의 요구사항에 따라 추가로 처리될 수 있습니다.

명령 형식:

docker trust inspect imageName | grep "SignedTag" | awk -F'"' '{print $4}'

nginx & Bitnami Docker 저장소를 사용하는 예:

docker trust inspect nginx | grep "SignedTag" | awk -F'"' '{print $4}'

docker trust inspect bitnami/java | grep "SignedTag" | awk -F'"' '{print $4}'

서명된 이미지가 없으면 No signatures 또는 canot access imageName이 반환됩니다.

Wordpress Docker repo를 사용한 서명된 이미지가 없는 repo(이 문서 작성 당시)의 예:

docker trust inspect wordpress | grep "SignedTag" | awk -F'"' '{print $4}'

레지스트리에 대한 멋진 웹 인터페이스를 원하는 경우 이 레지스트리 브라우저 도커 이미지를 사용할 수 있습니다.레지스트리, 다른 리포지토리 및 태그를 둘러보려는 경우 유용합니다.

enter image description here

언급URL : https://stackoverflow.com/questions/31251356/how-to-get-a-list-of-images-on-docker-registry-v2