Como obter uma lista de imagens no docker registry v2

204

Estou usando o Docker Registry v1 e estou interessado em migrar para a versão mais recente, v2. Mas preciso de uma maneira de obter uma lista de imagens presentes no registro; por exemplo, com o registro v1, posso executar uma solicitação GET http://myregistry:5000/v1/search?e o resultado é:

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "deis/router"
    },
    {
      "description": "",
      "name": "deis/database"
    }
  ]
}

Mas não consigo encontrar na documentação oficial algo semelhante para obter uma lista de imagens no registro. Alguém sabe uma maneira de fazê-lo na nova versão v2?

kikicarbonell
fonte
Ainda não é suficiente. Precisa das datas de criação e envio da imagem e esperamos incluir / suprimir as versões anteriores das tags. Também deve haver uma interface da Web real, certo? Eu estou falando com o nosso admin - só temos 2.0
Andrew Wolfe

Respostas:

405

Para a versão mais recente (em 31/07/2015) do Registro V2, você pode obter esta imagem no DockerHub:

docker pull distribution/registry:master

Listar todos os repositórios (efetivamente imagens):

curl -X GET https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

Listar todas as tags para um repositório:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}
Jonatan
fonte
3
De onde você obtém o certificado?
precisa saber é
3
@duality, caso seu registro esteja usando um certificado autoassinado ou um certificado assinado por uma CA raiz não confiável, você precisa fornecer o certificado para ondular para estabelecer uma conexão segura. Para estabelecer uma conexão insegura, você pode adicionar o sinalizador '--insecure'.
precisa saber é
5
-k, --insecure (SSL)
Ilja
9
Resultado padrão apenas mostrar 100 imagens registro, mas se você precisa mostrar mais você pode paginar o resultado com esta consulta: http://<registry-url>/v2/_catalog?n=<count>com contagem por exemplo 2000.
kikicarbonell
17
Se o registro estiver protegido por senha, usecurl -u <user>:<pass> -X GET ...
nsantos
77

você pode pesquisar em

http: // <ip/hostname>: <port>/ v2 / _catalog

Abhishek Jaiswal
fonte
4
... até recentemente, gostaria de acrescentar que https é necessário em vez de apenas http #
Nikola #
2
Não vejo essa necessidade do meu Docker Registry instalado recentemente!
Enok82
44

Obter catálogos

Por padrão, a API do registro retorna 100 entradas do catálogo, existe o código :

Quando você enrola a API do registro:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

Equivale a:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=100

Este é um método de paginação.

Quando a soma das entradas for superior a 100, você poderá fazer de duas maneiras:

Primeiro : dê um número maior

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=2000

Sencond : analisa o próximo URL do vinculador

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

Um elemento de link contido no cabeçalho de resposta:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

cabeçalho de resposta:

Link: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"

O elemento do link tem a última entrada desta solicitação, e você pode solicitar a próxima 'página':

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws

Se o cabeçalho da resposta contiver um elemento de link , você poderá fazê-lo em um loop .

Obter Imagens

Quando você obtém o resultado do catálogo, é o seguinte:

{ "repositories": [ "busybox", "ceph/mds" ] }

você pode obter as imagens em todos os catálogos:

curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list

retorna:

{"name":"busybox","tags":["latest"]}

litanhua
fonte
1
100 entradas definidas aqui
litanhua 24/03
2
Essa deve ser a resposta aceita. É a única resposta que explica como você contorna a temida paginação. A resposta atualmente aceita (jonatan) mostra apenas imagens começando com "a".
user2394284
e como você obteria a lista de tags ceph/mds? em geral, para qualquer repositório definido com /- /v2/_catalog/ceph/mdt/tags/listnão trabalho
tymik
25

A versão mais recente do Docker Registry disponível em https://github.com/docker/distribution suporta a API do catálogo. (v2 / _catalog). Isso permite a capacidade de pesquisar repositórios

Se estiver interessado, você pode tentar o CLI de registro de imagem do docker que criei para facilitar o uso dos recursos de pesquisa na nova distribuição do Docker Registry ( https://github.com/vivekjuneja/docker_registry_cli )

ZephyrPLUSPLUS
fonte
21

Criamos uma ferramenta CLI para esse fim: docker-ls Permite navegar em um registro do docker e suporta autenticação por token ou autenticação básica.

Christian Speckner
fonte
21

Isso está me deixando louco, mas finalmente reuni todas as peças. Desde 25/01/2015, confirmei que é possível listar as imagens no registro do docker V2 (exatamente como @jonatan mencionado acima).

Eu votaria nessa resposta se tivesse o representante.

Em vez disso, vou expandir a resposta. Como o registro V2 é feito com a segurança em mente, acho apropriado incluir como configurá-lo com um certificado autoassinado e executar o contêiner com esse certificado para que uma chamada https possa ser feita com esse certificado:

Este é o script que eu realmente uso para iniciar o registro:

sudo docker stop registry
sudo docker rm -v registry
sudo docker run -d \
  -p 5001:5001 \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /root/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ 
  -e REGISTRY_HTTP_DEBUG_ADDR=':5001' \
  registry:2.2.1

Isso pode ser óbvio para alguns, mas eu sempre me confundo com chaves e certificados. O arquivo que precisa ser referenciado para fazer a chamada @jonaton menciona acima **, é o domain.crt listado acima. (Desde que coloquei domain.crt /root, fiz uma cópia no diretório do usuário em que ele poderia ser acessado.)

curl --cacert ~/domain.crt https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

** O comando acima foi alterado: -X GET não funcionou quando tentei.

Nota: https://myregistry:5000(como acima) deve corresponder ao domínio atribuído ao certificado gerado.

Cognitiaclaeves
fonte
7

Aqui está um pequeno liner agradável (usa JQ) para imprimir uma lista de repositórios e tags associadas.

Se você não tiver jqinstalado, poderá usar:brew install jq

# This is my URL but you can use any
REPO_URL=10.230.47.94:443

curl -k -s -X GET https://$REPO_URL/v2/_catalog \
 | jq '.repositories[]' \
 | sort \
 | xargs -I _ curl -s -k -X GET https://$REPO_URL/v2/_/tags/list
Jeef
fonte
argh, acabei de escrever isso e, em seguida, encontrei o seu: S, mas continuarei com minha resposta, pois mostra como lidar também com a autenticação básica e explica por que funciona. Também filtra o resultado em uma lista de imagens planas.
Craig Ringer
Apenas para o caso de o jq não estar na sua distribuição Linux, obtenha-o stedolan.github.io/jq/download É uma pequena ferramenta muito útil.
ISQ
5

Eu tive que fazer o mesmo aqui e os trabalhos acima, exceto que tive que fornecer detalhes de login, pois era um repositório de docker local.

É conforme o descrito acima, mas com o fornecimento do nome de usuário / senha no URL.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog

Ele volta como JSON não formatado.

Eu o canalizei através do formatador python para facilitar a leitura humana, caso você queira tê-lo nesse formato.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool
Chai
fonte
4

Usando os pontos de extremidade "/ v2 / _catalog" e "/ tags / list", não é possível listar todas as imagens. Se você pressionou algumas imagens diferentes e as marcou como "mais recentes", não pode realmente listar as imagens antigas! Você ainda pode puxá-los se consultá-los usando digest "docker pull ubuntu @ sha256: ac13c5d2 ...". Portanto, a resposta é: não há como listar imagens, você pode listar apenas tags que não são iguais

user1616472
fonte
3

Se alguns chegarem tão longe.

Tomando o que outros já disseram acima. Aqui está uma lista que coloca a resposta em um arquivo de texto formatado, json.

curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst

Isso parece

{
  "repositories": [
    "somerepo/somecontiner",
    "somerepo_other/someothercontiner",
 ...
  ]
}

Pode ser necessário alterar o `? N = xxxx 'para corresponder a quantos contêineres você possui.

A seguir, é uma maneira de remover automaticamente contêineres antigos e não utilizados.

nelaaro
fonte
2

A funcionalidade do registro de pesquisa do Docker v2 não é suportada no momento neste momento. Consulte a discussão desde fevereiro de 2015: "propor a funcionalidade de pesquisa de registro # 206" https://github.com/docker/distribution/issues/206

Eu escrevi um script que você pode encontrar: https://github.com/BradleyA/Search-docker-registry-v2-script.1.0 Não é bonito, mas obtém as informações necessárias no registro privado.

Bradley Allen
fonte
2

Eu escrevi uma ferramenta de linha de comando fácil de usar para listar imagens de várias maneiras (como listar todas as imagens, listar todas as tags dessas imagens, listar todas as camadas dessas tags).

Também permite excluir imagens não utilizadas de várias maneiras, como excluir apenas tags mais antigas de uma única imagem ou de todas as imagens, etc. Isso é conveniente quando você está preenchendo seu registro de um servidor de IC e deseja manter apenas as versões mais recentes / estáveis.

Está escrito em python e não precisa que você baixe imagens grandes e grandes de registro personalizadas.

anoxis
fonte
2

Aqui está um exemplo que lista todas as tags de todas as imagens no registro. Ele também lida com um registro configurado para autenticação HTTP Basic.

THE_REGISTRY=localhost:5000

# Get username:password from docker configuration. You could
# inject these some other way instead if you wanted.
CREDS=$(jq -r ".[\"auths\"][\"$THE_REGISTRY\"][\"auth\"]" .docker/config.json | base64 -d)

curl -s --user $CREDS https://$THE_REGISTRY/v2/_catalog | \
    jq -r '.["repositories"][]' | \
    xargs -I @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

Explicação:

  • extrair nome de usuário: senha de .docker / config.json
  • faça uma solicitação https ao registro para listar todos os "repositórios"
  • filtrar o resultado json para uma lista simples de nomes de repositórios
  • para cada nome de repositório:
  • faça uma solicitação https ao registro para listar todas as "tags" desse "repositório"
  • filtre o fluxo de objetos json resultantes, imprimindo pares "repository": "tag" para cada tag encontrada em cada repositório
Craig Ringer
fonte
1

Esse encadeamento remonta há muito tempo, as ferramentas mais recentes que se deve considerar são skopeoe crane.

skopeosuporta assinatura e possui muitos outros recursos, enquanto craneé um pouco mais minimalista e achei mais fácil integrar com um simples shell script.

errordeveloper
fonte
0

Como cada registro é executado como um contêiner, o ID do contêiner possui um arquivo de log associado ID-json.log, que contém os arquivos vars.name = [imagem] e vars.reference = [tag]. Um script pode ser usado para extrapolar e imprimi-los. Esse talvez seja um método para listar imagens enviadas para o registro V2-2.0.1.

Phil Pinkerton
fonte