docker registry v2에서 이미지 목록을 얻는 방법


203

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

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

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


아직 충분하지 않습니다. 이미지 생성 및 이미지 푸시 날짜가 필요하며 이전 태그 버전을 포함 / 억제하기를 바랍니다. 실제 웹 인터페이스도 있어야합니까? 관리자와 대화하고 있습니다 – 2.0 만 있습니다
Andrew Wolfe

답변:


404

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

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"]}

3
인증서는 어디서 얻습니까?
duality_

3
@duality 레지스트리가 자체 서명 된 인증서 또는 신뢰할 수없는 루트 CA가 서명 한 인증서를 사용하는 경우 보안 연결을 설정하기 위해 인증서를 제공해야합니다. 안전하지 않은 연결을하려면 대신 '--unsecure'플래그를 추가하면됩니다.
jonatan

5
-k,-안전하지 않은 (SSL)
Ilja

9
기본 결과는 100 개의 이미지 레코드 만 표시하지만 더 많이 표시해야하는 경우이 쿼리를 사용하여 결과를 페이지 매김 할 수 있습니다 ( http://<registry-url>/v2/_catalog?n=<count>예 : 2000과 같은 count).
kikicarbonell

17
레지스트리가 비밀번호로 보호 된 경우curl -u <user>:<pass> -X GET ...
nsantos

77

당신은 검색 할 수 있습니다

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


4
... 나는 HTTPS를 대신 HTTP 요구되는 추가처럼 거라고 최근의로
니콜라

2
최근에 설치 한 Docker Registry가 필요하지 않습니다.
Enok82

43

카탈로그 받기

기본적으로 레지스트리 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

Sencond : 다음 링커 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"]}



2
이것이 정답입니다. 그것은 당신이 두려운 매김을 극복하는 방법을 설명하는 유일한 대답입니다. 현재 허용되는 답변 (jonatan)에는 "a"로 시작하는 이미지 만 표시됩니다.
user2394284

태그 목록은 ceph/mds어떻게 얻 습니까? 일반적으로 정의 된 저장소에 /- /v2/_catalog/ceph/mdt/tags/list하지 작동합니까
tymik



21

이것은 나를 미치게 만들었지 만 마침내 모든 조각을 모았습니다. 2015 년 1 월 5 일 현재 docker 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

이것은 일부에게는 분명 할 수 있지만 항상 키와 인증서가 섞여 있습니다. @jonaton을 호출하기 위해 참조해야하는 파일은 위에 언급 된 **입니다. (domain.crt을 넣었으므로 /root액세스 할 수있는 사용자 디렉토리에 사본을 작성했습니다.)

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

** 위 명령이 변경되었습니다. -X GET을 시도해도 실제로 작동하지 않았습니다.

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



7

다음은 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

아아, 방금 작성한 다음 당신을 발견했습니다 : S 그러나 기본 인증도 처리하는 방법을 보여주기 때문에 대답을 지키겠습니다. 왜 작동하는지 설명합니다. 또한 결과를 플랫 이미지 목록으로 필터링합니다.
Craig Ringer

jq가 Linux 배포판에없는 경우를 대비하여 stedolan.github.io/jq/download를 가져 오십시오 . 매우 유용한 작은 도구입니다.
ISQ

5

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

위와 같지만 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

4

"/ v2 / _catalog"및 "/ tags / list"엔드 포인트를 사용하면 실제로 모든 이미지를 나열 할 수는 없습니다. 몇 가지 다른 이미지를 푸시하고 "최신"으로 태그를 지정하면 이전 이미지를 실제로 나열 할 수 없습니다! 다이제스트 "docker pull ubuntu @ sha256 : ac13c5d2 ..."를 사용하여 참조하는 경우 계속 끌어 올 수 있습니다. 따라서 대답은-이미지를 나열 할 수있는 방법이 없습니다. 동일하지 않은 태그 만 나열 할 수 있습니다


3

어떤 사람들은 이것을 멀리 얻으십시오.

다른 사람들이 이미 위에서 말한 것을 취합니다. 다음은 답변을 텍스트 파일 형식 json으로 넣는 단일 라이너입니다.

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

이것은 다음과 같습니다

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

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

다음은 오래되고 사용되지 않는 컨테이너를 자동으로 제거하는 방법입니다.



2

내가 쓴 사용하기 쉬운 명령 줄 도구를 다양한 방법으로 이미지를 상장 (목록처럼 모든 이미지를 목록에서 해당 이미지의 모든 태그 목록에서 해당 태그의 모든 레이어).

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

그것은 파이썬으로 작성되었으며 부피가 큰 큰 사용자 정의 레지스트리 이미지를 다운로드 할 필요가 없습니다.


2

다음은 레지스트리에있는 모든 이미지의 모든 태그를 나열하는 예입니다. 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"][]'

설명:

  • .docker / config.json에서 username : password를 추출하십시오.
  • 모든 "리포지토리"를 나열하기 위해 레지스트리에 https 요청을합니다.
  • json 결과를 간단한 저장소 이름 목록으로 필터링하십시오.
  • 각 저장소 이름에 대해 :
  • 해당 "리포지토리"에 대한 모든 "태그"를 나열하기 위해 레지스트리에 https 요청을합니다.
  • 결과 json 객체의 스트림을 필터링하여 각 저장소에서 발견 된 각 태그에 대해 "repository": "tag"쌍을 인쇄합니다.

1

이 스레드는 오래 전부터 사용되어 왔으며 가장 최근에 고려해야 할 도구는 skopeocrane입니다.

skopeo서명을 지원하고 다른 많은 기능을 가지고 있지만 crane, 좀 더 미니멀하고 간단한 셸 스크립트로 통합하기가 더 쉽다는 것을 알았습니다.


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.