Як я можу перерахувати всі теги для зображення Docker у віддаленому реєстрі?


206

Як я можу перерахувати всі теги зображення Docker у віддаленому реєстрі Docker за допомогою CLI (бажаного) або завитка?

Переважно без витягування всіх версій з віддаленого реєстру. Я просто хочу перерахувати теги.



1
Я відкрив квиток із проханням про цю функцію в docker(1) github.com/docker/for-linux/isissue/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 (або додати PATH env до свого .bashrc/ .zshrc), і вкласти цей код у нього. Потім додайте виконавчі дозволи ( chmod +x dockertags).

Використання:

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

dockertags php apache ---> перерахуйте всі теги php php, що містять 'apache'


1
Ви можете загортати всю річ у ехо [backtick] ...[backtick], щоб конденсувати її в одну лінію. І / або замініть "debian" на 1 долар і покладіть його в сценарій під назвою "dockertags" під / usr / local / bin. Тоді перед закриттям backtick ви можете додати | grep $ 2. Потім chmod + x it, і тоді ви можете перейти "dockertags php apache", щоб побачити всі теги php, що містять apache.
dagelf

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}(якщо він порожній, немає перемикання або парами). Це може допомогти всім, хто використовує приватні репо,
MrMesees

79

Щодо Docker Registry V2, GETдостатньо простого :

GET /v2/<name>/tags/list

Докладніше див. У документах .


3
Виходячи з інформації в підрозділі «Теги» в документах , схоже, цей GET вимагає авторизації, тому API v1 sedздається насправді простішим для швидкого перевірки ...
akavel

3
Якщо ви отримуєте "несанкціоновану" помилку, дивіться мою альтернативну відповідь . Без образи особі, яка розмістила оригінальну відповідь. Мені довелося вжити додаткових кроків, щоб отримати відповідь вище, щоб працювати, і хотів допомогти іншим.
RobV8R

23

Якщо ви хочете використовувати API реєстру докера v2, він перераховує теги за сторінками. Щоб перелічити всі теги зображення, ви можете додати в URL-адресу великий параметр_размер, наприклад

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

2
Здається, що Docker Hub обмежує розмір сторінки максимальним рівнем 100.
Шейн

2
@Shane О, справді? Я не зустрічав зображення з такою кількістю сторінок. Чи працює URL-адреса https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101?
0xCC

2
javaзображення є хорошим прикладом. Так, ви можете робити такі речі, як register.hub.docker.com/v2/repositories/library/java/tags/… . Для прикладів дивіться nextта previousпосилання в результаті.
Шейн

19

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

Найновішу версію docker-tagsможна знайти в моєму GitHubGist: "Список тегів зображень Docker за допомогою bash" .

Функція docker-тегів має залежність від 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
Що це за веб-сайт tutum.co, на який ви кажете, що я повинен дати їм свій логін і пароль dockerhub?
Накілон

1
@Nakilon Коли я писав цю відповідь, кілька років тому Tutum був службою, яка надала приватний реєстр Docker. І я не "даю їм" свій пароль, я автентифікую їх службу за допомогою стандартної HTTP-базової автентифікації через https.
Йохан

Тутум вже не існує. Чи можете ви оновити свою відповідь, щоб люди випадково не надсилали свої повноваження тому, хто зараз є власником цього домену?
опій


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.

Ви можете підключити його до будь-якого реєстру, включаючи приватний, якщо він підтримує HTTP API V2 Docker Registry



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. Обробляє repo 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
matson kepson

використовуючи версію 1:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo

1

Я це зробив, коли мені потрібно реалізувати завдання, в якому, якщо користувач якимось чином вводить неправильний тег, тоді ми повинні надати список усіх тегів, присутніх у репо (recker Docker) в реєстрі. Отже, у мене є код у пакетному скрипті.

<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

Тоді я можу поздоровитись за 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"[]' 

Якщо ви хочете порівняти те, що є у вашому локальному реєстрі відкритих зрушень, з тим, що знаходиться у висхідному регістрі.redhat.com, то ось повний сценарій .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.