Como posso listar todas as marcas de uma imagem do Docker em um registro remoto?


206

Como posso listar todas as marcas de uma imagem do Docker em um registro remoto do Docker usando a CLI (preferencial) ou ondulação?

De preferência sem extrair todas as versões do registro remoto. Eu só quero listar as tags.



1
Abri um ticket solicitando esse recurso no docker(1) github.com/docker/for-linux/issues/455
Winny

Respostas:


177

Eu tenho a resposta daqui . Muito obrigado! :)

Apenas um script de uma linha: (encontre todas as tags do 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}'

ATUALIZAÇÃO Obrigado pelo conselho de @ degelf. Aqui está o script de shell.

#!/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}"

Você pode simplesmente criar um novo nome de arquivo dockertags, em / usr / local / bin (ou adicionar um caminho PAT ao seu .bashrc/ .zshrc), e colocar esse código nele. Em seguida, adicione as permissões executáveis ​​( chmod +x dockertags).

Uso:

dockertags ubuntu ---> lista todas as tags do ubuntu

dockertags php apache ---> lista todas as tags php php que contêm 'apache'


1
Você pode agrupar tudo em eco [backtick] ...[backtick] para condensar em uma linha. E / ou substitua "debian" por $ 1 e coloque-o em um script chamado "dockertags" em / usr / local / bin. Antes do backtick de fechamento, você pode adicionar | grep $ 2. Depois, chmod + x, e então você pode "dockertags php apache" para ver todas as tags php que contêm apache.
23617 dagelf

8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'se você tiver jqinstalado
Tanner


1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'é muito mais limpo escrito #tr -d '[]" '
William Pursell

1
Modifiquei para usar o segundo argumento posicional como nome de usuário: senha, para que eu pudesse trocar o wget por curl e usar a userauth="-u ${2}"permissão ${userauth}(se estiver em branco, sem alternância ou parâmetros). Isto pode ajudar qualquer pessoa usando repo privado é
MrMesees

79

A partir do Docker Registry V2, GETbasta:

GET /v2/<name>/tags/list

Veja documentos para mais.


3
Com base na informação em 'Marcas subseção nos docs , este GET parece requerer autorização, de modo que o v1 API + sedparece ser realmente simples de usar para uma verificação rápida ...
akavel

3
Se você estiver recebendo um erro "não autorizado", consulte minha resposta alternativa . Nenhuma ofensa à pessoa que postou a resposta original. Tive de tomar medidas adicionais para que a resposta acima funcionasse e queria ajudar os outros.
RobV8R 19/08/1918

23

Se você deseja usar a API do registro do docker v2, ela lista as tags por páginas. Para listar todas as tags de uma imagem, convém adicionar um parâmetro grande page_size ao URL, por exemplo

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

2
O Docker Hub parece limitar o tamanho da página a um máximo efetivo de 100.
Shane

2
@ Shane Oh realmente? Não encontrei uma imagem com tantas páginas. Um URL gosta de https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101trabalhar?
0CC3 17/07

2
a javaimagem é um bom exemplo. Sim, você pode fazer coisas como registry.hub.docker.com/v2/repositories/library/java/tags/… . Veja os links nexte previousno resultado para exemplos.
Shane

19

A API do Docker V2 requer um token de portador OAuth com as declarações apropriadas. Na minha opinião, a documentação oficial é bastante vaga sobre o assunto. Para que outros não passem pela mesma dor que eu, ofereço a docker-tagsfunção abaixo .

A versão mais recente do docker-tags pode ser encontrada no meu GitHubGist: "Listar tags de imagem do Docker usando o bash" .

A função docker-tags depende da jq . Se você está jogando com JSON, provavelmente já o possui.

#!/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
}

Exemplo

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

É certo que docker-tagsfaz várias suposições. Especificamente, os parâmetros de solicitação do OAuth são principalmente codificados. Uma implementação mais ambiciosa faria uma solicitação não autenticada ao registro e derivava os parâmetros OAuth da resposta não autenticada.


3
Não há necessidade arr=("$@"). Basta escreverdocker-tags() { for item; do ....
William Pursell

Obrigado por isso. Obter esse token estava me deixando louco.
FelicianoTech

17

Eu consegui fazê-lo funcionar usando curl:

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

Observe que image_namenão deve conter detalhes do usuário etc. Por exemplo, se você estiver pressionando a imagem com o nome tutum.co/username/x, image_namedeve estar x.


1
O endpoint v2 está documentado aqui: docs.docker.com/registry/spec/api/#listing-image-tags
Morloch

1
Qual é o site tutum.co que você diz que devo fornecer a eles meu login e senha do dockerhub?
Nakilon 13/03/19

1
@Nakilon Quando escrevi esta resposta, há vários anos, Tutum era um serviço que fornecia um Registro Docker particular. E eu não estou "dando a eles" minha senha, eu me autentico com o serviço deles usando autenticação básica HTTP padrão por https.
Johan

Tutum não existe mais. Você pode atualizar sua resposta para que as pessoas não enviem suas credenciais acidentalmente para quem possui esse domínio agora?
opyh 24/06


6

Se a ferramenta de análise JSON, jqestiver disponível

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

1
Use aspas para evitar problemas com jq:'.[].name'
Soullivaneuh

1
@Soullivaneuh que problemas podem acontecer sem aspas? Obrigado!
sigjuice

Com zsh, eu tenho o seguinte erro: no matches found: .[].name. Mas funciona bem no bash, talvez seja o seu shell padrão?
Soullivaneuh

@Soullivaneuh thanks! Eu adicionei aspas ao jqcomando
sigjuice

4

Consulte Utilitário CLI: https://www.npmjs.com/package/docker-browse

Permite a enumeração de tags e imagens.

docker-browse tags <image>listará todas as tags da imagem. por exemplodocker-browse tags library/alpine

docker-browse imageslistará todas as imagens no registro. Não está disponível atualmente paraindex.docker.io .

Você pode conectá-lo a qualquer registro, incluindo o seu particular, desde que ele suporte a API HTTP V2 do Docker Registry



2

Você também pode usar este recado:

# vim /usr/sbin/docker-tags 

& Anexar o seguinte (como está):

#!/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

Tornar executável:

# chmod 755 /usr/sbin/docker-tags

Finalmente tente por:

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

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[Espero que você esteja ciente de $ & # antes de executar qualquer comando]


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'

Você pode usá-lo se o seu ambiente não tiver 'jq', =)


2

Obter todas as tags do Docker Hub: esse comando usa o JSONprocessador de linha de comando jqpara selecionar os nomes de tags JSONretornados pelo Docker Hub Registry (as aspas são removidas tr). Substitua a biblioteca pelo nome de usuário do Docker Hub, debian pelo nome da imagem:

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

2
Por favor, considere adicionar uma pequena explicação sobre o porquê dessa resposta à pergunta, o que ela faz, ...
β.εηοιτ.βε

2

Aqui está um script do Powershell que escrevi para o Windows. Manipula os repositórios v1 e 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

Você pode conseguir executando no terminal isso:

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

Além disso, se você não tiver jq, precisará instalá-lo

sudo apt-get install jq

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name você vai economizar um comando grep
matson kepson

usando a versão 1:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo

1

Fiz isso quando tenho que implementar uma tarefa na qual, se o usuário digitar a tag errada, forneça a lista de todas as tags presentes no repositório (repositório do Docker) presente no registro. Então, eu tenho código no lote Script.

<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>

Portanto, podemos fornecer argumentos para arquivos em lote como:

Dockerfile java version7 


1

A API do Docker Registry tem um terminal para listar todas as tags .

Parece que Tutum tem um ponto de extremidade semelhante , bem como uma maneira de acessar via tutum-cli .

Com o tutum-cli, tente o seguinte:

tutum tag list <uuid>

1
Eu não acho que isso funcione para imagens do registro. Acabei de receber um "Identificador '<id>' não corresponde a nenhum serviço, nó ou cluster de nó".
5282 Johan

1

No powershell 5.1, eu tenho um script list_docker_image_tags.ps1 simples como este:

[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

Então eu posso grep para 4,7 tags como este:

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

1

Você pode listar todas as tags com o 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"
]

Para registros externos:

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

0

Se as pessoas quiserem ler tags do registro RedHat em https://registry.redhat.io/v2, as etapas são:

# 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"[]' 

Se você deseja comparar o que você tem no registro openshift local com o registro upstream registry.redhat.com, aqui está um script completo .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.