원격 레지스트리에 Docker 이미지의 모든 태그를 나열하려면 어떻게해야합니까?


206

CLI (선호) 또는 curl을 사용하여 원격 Docker 레지스트리에 Docker 이미지의 모든 태그를 나열하려면 어떻게해야합니까?

원격 레지스트리에서 모든 버전을 가져 오지 않는 것이 좋습니다. 태그 만 나열하고 싶습니다.




답변:


177

나는 여기 에서 대답을 얻었다 . 고마워요! :)

한 줄짜리 스크립트 :( 데비안의 모든 태그를 찾으십시오)

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'

@degelf의 조언에 감사드립니다. 쉘 스크립트는 다음과 같습니다.

#!/bin/bash

if [ $# -lt 1 ]
then
cat << HELP

dockertags  --  list all tags for a Docker image on a remote registry.

EXAMPLE: 
    - list all tags for ubuntu:
       dockertags ubuntu

    - list all php tags containing apache:
       dockertags php apache

HELP
fi

image="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'`

if [ -n "$2" ]
then
    tags=` echo "${tags}" | grep "$2" `
fi

echo "${tags}"

당신은, 새 파일 이름을 만들 수 있습니다 dockertags, / usr / 지방 / 빈에서 (또는 경로의 ENV를 추가 .bashrc/ .zshrc), 그 안에 그 코드를 넣어. 그런 다음 실행 권한 ( chmod +x dockertags)을 추가하십시오 .

용법:

dockertags ubuntu ---> 우분투의 모든 태그를 나열

dockertags php apache ---> 'apache'를 포함하는 모든 PHP 태그를 나열합니다.


1
전체 내용을 echo [backtick] ...[backtick]로 감싸서 한 줄로 압축 할 수 있습니다. "debian"을 $ 1로 바꾸고 / usr / local / bin 아래의 "dockertags"라는 스크립트에 넣으십시오. 그런 다음 닫기 백틱 전에 grep $ 2를 추가 할 수 있습니다. 그런 다음 chmod + x로, "dockertags php apache"로 가서 아파치를 포함하는 모든 PHP 태그를 볼 수 있습니다.
dagelf

8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'당신이 경우 jq설치
태너

1
V2 API 에 대한 업데이트 된 답변을 게시했습니다 .
RobV8R

1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'훨씬 더 명확하게 작성tr -d '[]" '
윌리엄 Pursell에게

1
두 번째 위치 인수를 username : password로 사용 userauth="-u ${2}"하여 curl에 대한 wget을 전환하고 나를 사용할 수 있도록 허용했습니다 ${userauth}(공백이 없으면 전환 또는 매개 변수가 없음). 개인 레포를 사용하는 사람에게 도움이 될 수 있습니다.
MrMesees

79

Docker Registry V2에서 간단한 GET것으로 충분합니다.

GET /v2/<name>/tags/list

자세한 내용은 문서 를 참조하십시오 .


3
docs의 Tags 하위 섹션 에있는 정보를 기반으로 ,이 GET은 인증이 필요한 것 같습니다. 따라서 v1 API + sed는 빠른 검사에 실제로 사용하기가 더 단순 해
보입니다

3
"무단"오류가 발생하면 대체 답변을 참조하십시오 . 원래 답변을 게시 한 사람에게 위반이 없습니다. 위의 답변을 적용하려면 추가 조치를 취해야하며 다른 사람들을 돕기를 원했습니다.
RobV8R

23

docker registry v2 API를 사용하려면 페이지별로 태그를 나열합니다. 이미지의 모든 태그를 나열하려면 URL에 큰 page_size 매개 변수를 추가하십시오 (예 :

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags?page_size=1024'|jq '."results"[]["name"]'

2
Docker Hub는 page_size를 최대 100으로 제한하는 것으로 보입니다.
Shane

2
@Shane 아 진짜? 많은 페이지가있는 이미지가 없습니다. URL이 https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101작동합니까?
0xCC

2
java이미지가 좋은 예입니다. 예, registry.hub.docker.com/v2/repositories/library/java/tags/… 와 같은 작업을 수행 할 수 있습니다 . 예를 보려면 결과 의 nextprevious링크를 참조하십시오 .
셰인

19

Docker V2 API에는 적절한 클레임이있는 OAuth 베어러 토큰이 필요합니다. 제 생각에 공식 문서는 주제에 대해 다소 모호합니다. 다른 사람들이 내가했던 것과 같은 고통을 겪지 않도록 아래 docker-tags기능을 제공합니다 .

의 최신 버전을 docker-tagsGitHubGist 에서 찾을 수 있습니다 : "bash를 사용하여 Docker 이미지 태그 나열" .

docker-tags 함수는 jq에 종속됩니다 . JSON으로 놀고 있다면 이미 가지고있을 것입니다.

#!/usr/bin/env bash
docker-tags() {
    arr=("$@")

    for item in "${arr[@]}";
    do
        tokenUri="https://auth.docker.io/token"
        data=("service=registry.docker.io" "scope=repository:$item:pull")
        token="$(curl --silent --get --data-urlencode ${data[0]} --data-urlencode ${data[1]} $tokenUri | jq --raw-output '.token')"
        listUri="https://registry-1.docker.io/v2/$item/tags/list"
        authz="Authorization: Bearer $token"
        result="$(curl --silent --get -H "Accept: application/json" -H "Authorization: Bearer $token" $listUri | jq --raw-output '.')"
        echo $result
    done
}

docker-tags "microsoft/nanoserver" "microsoft/dotnet" "library/mongo" "library/redis"

물론 docker-tags몇 가지 가정을합니다. 특히 OAuth 요청 매개 변수는 대부분 하드 코딩되어 있습니다. 보다 야심 찬 구현은 레지스트리에 대한 인증되지 않은 요청을하고 인증되지 않은 응답에서 OAuth 매개 변수를 파생시킵니다.


3
필요가 없습니다 arr=("$@"). 그냥 써주세요docker-tags() { for item; do ....
William Pursell

감사합니다. 그 토큰을 얻는 것이 나를 미치게 만들었습니다.
FelicianoTech

17

curl을 사용하여 작동하도록했습니다.

curl -u <username>:<password> https://tutum.co/v1/repositories/<username>/<image_name>/tags

참고 image_name명명 된 이미지를 추진하는 경우 예를 들어 등 사용자의 세부 사항을 포함 할 수 없습니다 tutum.co/username/x다음 image_name되어야한다 x.


1
v2 엔드 포인트는 여기에 문서화되어 있습니다. docs.docker.com/registry/spec/api/#listing-image-tags
morloch

1
이 tutum.co 웹 사이트에서 내 dockerhub 로그인 및 암호를 제공해야한다고 말합니까?
Nakilon

1
@Nakilon이 답변을 몇 년 전에 작성했을 때 Tutum은 개인 Docker Registry를 제공하는 서비스였습니다. 그리고 나는 암호를 "주지"않고 https를 통한 표준 HTTP 기본 인증을 사용하여 서비스로 인증합니다.
Johan

Tutum은 더 이상 존재하지 않습니다. 사람들이 실수로 해당 자격 증명을 해당 도메인을 소유 한 사람에게 보내지 않도록 회신을 업데이트 할 수 있습니까?
opyh


6

JSON 구문 분석 도구 jq가 사용 가능한 경우

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
    jq -r '.[].name'

1
jq와 관련된 문제를 피하기 위해 따옴표를 사용하십시오 :'.[].name'
Soullivaneuh

1
@Soullivaneuh 따옴표없이 어떤 문제가 발생할 수 있습니까? 감사!
sigjuice

zsh를 사용하면 다음 오류가 발생 no matches found: .[].name합니다. 그러나 그것은 bash에서 잘 작동합니다. 아마도 기본 쉘입니까?
Soullivaneuh

@Soullivaneuh 감사합니다! jq명령 에 따옴표를 추가했습니다
sigjuice

4

CLI 유틸리티 참조 : https://www.npmjs.com/package/docker-browse

태그와 이미지를 열거 할 수 있습니다.

docker-browse tags <image>이미지의 모든 태그를 나열합니다. 예 :docker-browse tags library/alpine

docker-browse images레지스트리의 모든 이미지를 나열합니다. 현재 사용할 수 없습니다 index.docker.io.

Docker Registry HTTP API V2를 지원하는 한 개인 레지스트리를 포함하여 모든 레지스트리에 연결할 수 있습니다.



2

이 스크랩을 사용할 수도 있습니다.

# vim /usr/sbin/docker-tags 

다음에 추가 (있는 그대로) :

#!/bin/bash
im="$1"
[[ -z "$im" ]] && { echo -e '\e[31m[-]\e[39m Where is the image name ??' ; exit ; }
[[ -z "$(echo "$im"| grep -o '/')" ]] && { link="https://hub.docker.com/r/library/$im/tags/" ; } || { link="https://hub.docker.com/r/$im/tags/" ; }
resp="$(curl -sL "$link")"
err="$(echo "$resp" | grep -o 'Page Not Found')"
if [[ ! -z "$err" ]] ; then
    echo -e "\e[31m[-]\e[39m No Image Found with name => [ \e[32m$im\e[39m ]"
    exit
else
    tags="$(echo "$resp"|sed  -e 's|}|\n|g' -e 's|{|\n|g'|grep '"result"'|sed -e 's|,|\n|g'|cut -d '[' -f2|cut -d ']' -f1|sed  '/"tags":/d'|sed -e 's|"||g')"
    echo -e "\e[32m$tags\e[39m"
fi

그것을 실행 가능하게 만드십시오 :

# chmod 755 /usr/sbin/docker-tags

그런 다음 마지막으로 시도하십시오.

$ docker-tags testexampleidontexist
   [-] No Image Found with name => [ testexampleidontexist ]

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[ 명령을 실행하기 전에 $ & #에 대해 알고 있기를 바랍니다 ]


2
curl -u <username>:<password> https://$your_registry/v2/$image_name/tags/list -s -o - | \
    tr -d '{' | tr -d '}' | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | \
    awk -F: '{print $3}' | sed -e 's/,/\n/g'

env에 'jq'가 없으면 사용할 수 있습니다. =)


2

Docker Hub에서 모든 태그 가져 오기 :이 명령은 명령 행 JSON처리기 jq를 사용 JSON하여 Docker Hub 레지스트리 에서 리턴 된 태그 이름을 선택합니다 (따옴표는으로 제거됨 tr). 교체 라이브러리 의 부두 노동자 허브 사용자 이름과 데비안 이미지 이름 :

curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'

2
왜이 질문에 대한 답이되는지에 대한 작은 설명을 추가하는 것을 고려해보십시오. ...
β.εηοιτ.βε

2

다음은 Windows 용으로 작성된 Powershell 스크립트입니다. v1 및 v2 저장소를 처리합니다.

Get-DockerImageVersions.ps1 :

param (
  [Parameter (Mandatory=$true)]$ImageName,
  [Parameter (Mandatory=$false)]$RegistryURL
)

if (!$RegistryURL) 
{
  $RegistryURL = "https://registry.hub.docker.com/v1/repositories"
}

$list = ""
if ($RegistryURL -like "*v2*") 
{
  $list = "/list"
}

$URL = "$RegistryURL/$ImageName/tags$list"

write-debug $URL
$resp = Invoke-WebRequest -UseBasicParsing $URL | ConvertFrom-Json

if ($RegistryURL -like "*v2*") 
{
  $tags = $resp | select tags
  $tags.tags
} else {
  $tags = $resp | select name
  $tags.name
}

2

터미널에서 다음을 실행하여 얻을 수 있습니다.

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq . | grep name

또한 jq가 없으면 다음을 통해 설치해야합니다.

sudo apt-get install jq

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name 당신에게 그렙 명령을 저장합니다
맷슨 kepson

버전 1 사용 :curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo

1

사용자가 어떻게 든 잘못된 태그를 입력하면 레지스터에있는 repo (Docker repo)에있는 모든 태그 목록을 제공 해야하는 작업을 구현해야 할 때이 작업을 수행했습니다. 그래서 배치 스크립트에 코드가 있습니다.

<html>
<pre style="background-color:#bcbbbb;">
@echo off

docker login --username=xxxx --password=xxxx
docker pull %1:%2

IF NOT %ERRORLEVEL%==0 (
echo "Specified Version is Not Found "
echo "Available Version for this image is :"
for /f %%i in (' curl -s -H "Content-Type:application/json" -X POST -d "{\"username\":\"user\",\"password\":\"password\"}" https://hub.docker.com/v2/users/login ^|jq -r .token ') do set TOKEN=%%i
curl -sH "Authorization: JWT %TOKEN%" "https://hub.docker.com/v2/repositories/%1/tags/" | jq .results[].name
)
</pre>
</html>

따라서 이것으로 다음과 같이 배치 파일에 인수를 줄 수 있습니다.

Dockerfile Java version7 


1

Docker Registry API에는 모든 태그나열 하는 엔드 포인트가 있습니다.

Tutum 과 비슷한 엔드 포인트 가 있고 tutum-cli 를 통해 액세스하는 방법이 있습니다 .

tutum-cli를 사용하여 다음을 시도하십시오.

tutum tag list <uuid>

1
레지스트리 이미지에는 이것이 효과가 없다고 생각합니다. "식별자 '<id>'이 (가) 서비스, 노드 또는 노드 클러스터와 일치하지 않습니다."라는 메시지가 나타납니다.
Johan

1

powershell 5.1에는 다음 과 같은 간단한 list_docker_image_tags.ps1 스크립트가 있습니다.

[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [string]
    $image
)

$url = "https://registry.hub.docker.com/v1/repositories/{0}/tags" -f $image 
Invoke-WebRequest $url  | ConvertFrom-Json | Write-Output

그런 다음 4.7 태그를 grep 할 수 있습니다.

./list_docker_image_tags.ps1 microsoft/dotnet-framework | ?{ $_.name -match "4.7" }

1

skopeo로 모든 태그를 나열 할 수 있습니다 .

அ  ~  skopeo inspect docker://httpd |jq .RepoTags
[
  "2-alpine",
  "2.2-alpine",
  "2.2.29",
  "2.2.31-alpine",
  "2.2.31",
  "2.2.32-alpine",
  "2.2.32",
  "2.2.34-alpine",
  "2.2.34",
  "2.2",
  "2.4-alpine",
  "2.4.10",
  "2.4.12",
  "2.4.16",
  "2.4.17",
  "2.4.18",
  "2.4.20",
  "2.4.23-alpine",
  "2.4.23",
  "2.4.25-alpine",
  "2.4.25",
  "2.4.27-alpine",
  "2.4.27",
  "2.4.28-alpine",
  "2.4.28",
  "2.4.29-alpine",
  "2.4.29",
  "2.4.32-alpine",
  "2.4.32",
  "2.4.33-alpine",
  "2.4.33",
  "2.4.34-alpine",
  "2.4.34",
  "2.4.35-alpine",
  "2.4.35",
  "2.4.37-alpine",
  "2.4.37",
  "2.4.38-alpine",
  "2.4.38",
  "2.4.39-alpine",
  "2.4.39",
  "2.4.41-alpine",
  "2.4.41",
  "2.4.43-alpine",
  "2.4.43",
  "2.4",
  "2",
  "alpine",
  "latest"
]

외부 레지스트리의 경우 :

அ  ~  skopeo inspect --creds username:password docker://<registry-url>/<repo>/<image>

0

사람들이 RedHat 레지스트리에서 태그를 읽으려면 https://registry.redhat.io/v2다음 단계를 따르십시오.

# example nodejs-12 image
IMAGE_STREAM=nodejs-12
REDHAT_REGISTRY_API="https://registry.redhat.io/v2/rhel8/$IMAGE_STREAM"
# Get an oAuth token based on a service account username and password https://access.redhat.com/articles/3560571
TOKEN=$(curl --silent -u "$REGISTRY_USER":"$REGISTRY_PASSWORD" "https://sso.redhat.com/auth/realms/rhcc/protocol/redhat-docker-v2/auth?service=docker-registry&client_id=curl&scope=repository:rhel:pull" |  jq --raw-output '.token')
# Grab the tags
wget -q --header="Accept: application/json" --header="Authorization: Bearer $TOKEN" -O - "$REDHAT_REGISTRY_API/tags/list" | jq -r '."tags"[]' 

로컬 openshift 레지스트리에있는 것과 업스트림 registry.redhat.com에있는 것을 비교하려면 완전한 스크립트가 있습니다.

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