Как я могу перечислить все теги для образа Docker в удаленном реестре?


206

Как я могу перечислить все теги образа Docker в удаленном реестре Docker, используя CLI (предпочтительно) или curl?

Желательно не вытягивая все версии из удаленного реестра. Я просто хочу перечислить теги.



1
Я открыл билет с просьбой об этой функции в docker(1) github.com/docker/for-linux/issues/455
Винни

Ответы:


177

Я получил ответ отсюда . Большое спасибо! :)

Просто однострочный скрипт: (найдите все теги Debian)

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 / local / bin (или добавить env-переменную PATH в .bashrc/ .zshrc) и поместить этот код в него. Затем добавьте исполняемые права доступа ( chmod +x dockertags).

Использование:

dockertags ubuntu ---> перечислить все теги Ubuntu

dockertags php apache ---> перечислить все теги php php, содержащие 'apache'


1
Вы можете обернуть все это в echo [backtick] ...[backtick], чтобы сжать его в одну строку. И / или замените «debian» на $ 1 и поместите его в скрипт под названием «dockertags» в / usr / local / bin. Затем перед закрывающей обратной галочкой вы можете добавить | grep $ 2. Затем chmod + x it, а затем вы можете перейти к «dockertags php apache», чтобы увидеть все теги php, содержащие apache.
17

8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'если вы jqустановили
Tanner


1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'гораздо более четко написаноtr -d '[]" '
Уильям Перселл

1
Я изменил, чтобы использовать второй позиционный аргумент в качестве имени пользователя: пароль, чтобы я мог отключить wget для curl и использовать userauth="-u ${2}"разрешение ${userauth}(если оно пустое, без переключателей или параметров). Это может помочь любому, кто использует частные
репозитории

79

Начиная с Docker Registry V2, GETдостаточно:

GET /v2/<name>/tags/list

Смотрите документы для более.


3
Судя по информации, приведенной в подразделе «Теги» в документах , этот GET, по-видимому, требует авторизации, поэтому API-интерфейс v1 + sedкажется более простым в использовании для быстрой проверки ...
akavel

3
Если вы получаете «несанкционированную» ошибку, см. Мой альтернативный ответ . Не в обиду человеку, который разместил оригинальный ответ. Мне пришлось предпринять дополнительные шаги, чтобы получить ответ выше, чтобы работать, и хотел помочь другим.
RobV8R

23

Если вы хотите использовать API Docker Registry v2, он перечисляет теги по страницам. Чтобы получить список всех тегов изображения, вы можете добавить в 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, по-видимому, ограничивает размер страницы до максимального максимального значения 100.
Шейн

2
@ Шейн О, правда? Я не встречал изображения с таким количеством страниц. 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/… . См. nextИ previousссылки в результате для примеров.
Шейн

19

API Docker V2 требует токен-носитель OAuth с соответствующими утверждениями. На мой взгляд, официальная документация по этой теме довольно расплывчата. Чтобы другие не переживали ту же боль, что и я, я предлагаю следующую docker-tagsфункцию.

Самую последнюю версию docker-tagsможно найти в моем GitHubGist: «Список тегов изображения Docker с использованием bash» .

Функция 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 ....
Уильям Перселл

Спасибо тебе за это. Получение этого жетона сводило меня с ума.
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 описана
morloch

1
Что это за сайт tutum.co, который, как вы говорите, должен дать им мой логин и пароль от dockerhub?
Накилон

1
@Nakilon Когда я написал этот ответ, несколько лет назад Tutum был сервисом, предоставляющим личный реестр Docker. И я не «даю им» свой пароль, я аутентифицируюсь с их службой, используя стандартную базовую HTTP-аутентификацию через https.
Йохан

Тутум больше не существует. Можете ли вы обновить свой ответ, чтобы люди случайно не отправляли свои учетные данные тому, кто сейчас владеет этим доменом?
опых


6

Если jqдоступен инструмент разбора JSON,

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). Замените библиотеку именем пользователя Docker Hub, debian - именем образа:

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

2
Пожалуйста, подумайте над добавлением небольшого объяснения, почему этот ответ отвечает на вопрос, что он делает, ...
β.εηοιτ.βε

2

Вот скрипт Powershell, который я написал для Windows. Обрабатывает репо 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 спасет вас команда grep
Мэтсон Кепсон

используя версию 1:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
Данило

1

Я сделал это, когда мне нужно было выполнить задачу, в которой, если пользователь каким-то образом введет неправильный тег, мы должны предоставить список всех тегов, присутствующих в репо (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 версия 7 


1

У API реестра Docker есть конечная точка для перечисления всех тегов .

Похоже, у Tutum есть аналогичная конечная точка , а также способ доступа через tutum-cli .

С tutum-cli попробуйте следующее:

tutum tag list <uuid>

1
Я не думаю, что это работает для изображений реестра. Я просто получаю «Идентификатор <id> не соответствует ни одному сервису, узлу или кластеру узлов».
Йохан

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

Тогда я могу grep для 4.7 тегов, как это:

./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, то вот полный сценарий .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.