CLI (선호) 또는 curl을 사용하여 원격 Docker 레지스트리에 Docker 이미지의 모든 태그를 나열하려면 어떻게해야합니까?
원격 레지스트리에서 모든 버전을 가져 오지 않는 것이 좋습니다. 태그 만 나열하고 싶습니다.
docker(1)
github.com/docker/for-linux/issues/455
CLI (선호) 또는 curl을 사용하여 원격 Docker 레지스트리에 Docker 이미지의 모든 태그를 나열하려면 어떻게해야합니까?
원격 레지스트리에서 모든 버전을 가져 오지 않는 것이 좋습니다. 태그 만 나열하고 싶습니다.
docker(1)
github.com/docker/for-linux/issues/455
답변:
나는 여기 에서 대답을 얻었다 . 고마워요! :)
한 줄짜리 스크립트 :( 데비안의 모든 태그를 찾으십시오)
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 태그를 나열합니다.
...
[backtick]로 감싸서 한 줄로 압축 할 수 있습니다. "debian"을 $ 1로 바꾸고 / usr / local / bin 아래의 "dockertags"라는 스크립트에 넣으십시오. 그런 다음 닫기 백틱 전에 grep $ 2를 추가 할 수 있습니다. 그런 다음 chmod + x로, "dockertags php apache"로 가서 아파치를 포함하는 모든 PHP 태그를 볼 수 있습니다.
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'
당신이 경우 jq
설치
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'
훨씬 더 명확하게 작성tr -d '[]" '
userauth="-u ${2}"
하여 curl에 대한 wget을 전환하고 나를 사용할 수 있도록 허용했습니다 ${userauth}
(공백이 없으면 전환 또는 매개 변수가 없음). 개인 레포를 사용하는 사람에게 도움이 될 수 있습니다.
sed
는 빠른 검사에 실제로 사용하기가 더 단순 해
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"]'
https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101
작동합니까?
java
이미지가 좋은 예입니다. 예, registry.hub.docker.com/v2/repositories/library/java/tags/… 와 같은 작업을 수행 할 수 있습니다 . 예를 보려면 결과 의 next
및 previous
링크를 참조하십시오 .
Docker V2 API에는 적절한 클레임이있는 OAuth 베어러 토큰이 필요합니다. 제 생각에 공식 문서는 주제에 대해 다소 모호합니다. 다른 사람들이 내가했던 것과 같은 고통을 겪지 않도록 아래 docker-tags
기능을 제공합니다 .
의 최신 버전을 docker-tags
내 GitHubGist 에서 찾을 수 있습니다 : "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 매개 변수를 파생시킵니다.
arr=("$@")
. 그냥 써주세요docker-tags() { for item; do ....
curl을 사용하여 작동하도록했습니다.
curl -u <username>:<password> https://tutum.co/v1/repositories/<username>/<image_name>/tags
참고 image_name
명명 된 이미지를 추진하는 경우 예를 들어 등 사용자의 세부 사항을 포함 할 수 없습니다 tutum.co/username/x
다음 image_name
되어야한다 x
.
Yan Foto의 답변 ( v2 api )을 바탕으로 주어진 이미지의 태그를 나열 하는 간단한 Python 스크립트를 만들었습니다 .
용법:
./docker-registry-list.py alpine
산출:
{
"name": "library/alpine",
"tags": [
"2.6",
"2.7",
"3.1",
"3.2",
"3.3",
"3.4",
"3.5",
"3.6",
"3.7",
"edge",
"latest"
]
}
JSON 구문 분석 도구 jq
가 사용 가능한 경우
wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
jq -r '.[].name'
'.[].name'
no matches found: .[].name
합니다. 그러나 그것은 bash에서 잘 작동합니다. 아마도 기본 쉘입니까?
jq
명령 에 따옴표를 추가했습니다
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를 지원하는 한 개인 레지스트리를 포함하여 모든 레지스트리에 연결할 수 있습니다.
브라우저에서 사용 가능한 모든 태그를 보려면
https://registry.hub.docker.com/v1/repositories/<username>/<image_name>/tags
즉 https://hub.docker.com/r/localstack/localstack/tags
또는이 엔드 포인트를 사용하여 json 응답을 얻을 수 있습니다.
https://registry.hub.docker.com/v1/repositories/localstack/localstack/tags
이 스크랩을 사용할 수도 있습니다.
# 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
[ 명령을 실행하기 전에 $ & #에 대해 알고 있기를 바랍니다 ]
Docker Hub에서 모든 태그 가져 오기 :이 명령은 명령 행 JSON
처리기 jq
를 사용 JSON
하여 Docker Hub 레지스트리 에서 리턴 된 태그 이름을 선택합니다 (따옴표는으로 제거됨 tr
). 교체 라이브러리 의 부두 노동자 허브 사용자 이름과 데비안 이미지 이름 :
curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'
다음은 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
}
터미널에서 다음을 실행하여 얻을 수 있습니다.
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
당신에게 그렙 명령을 저장합니다
curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
사용자가 어떻게 든 잘못된 태그를 입력하면 레지스터에있는 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
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" }
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>
사람들이 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에있는 것을 비교하려면 완전한 스크립트가 있습니다.