portus - docker registry volumen
¿Cómo puedo encontrar la imagen de Docker con una etiqueta específica en el registro de Docker en la línea de comandos del docker? (9)
Intento localizar una etiqueta específica para la imagen del acoplador, ¿cómo puedo hacerlo en la línea de comandos? Intento evitar descargar todo y eliminar las imágenes innecesarias.
En el lanzamiento oficial de Ubuntu https://registry.hub.docker.com/_/ubuntu/ hay varias etiquetas (versión para él), mientras que cuando lo busco en línea de comando
user@ubuntu:~$ docker search ubuntu | grep ^ubuntu
ubuntu Official Ubuntu base image 354
ubuntu-upstart Upstart is an event-based replacement for ... 7
ubuntufan/ping 0
ubuntu-debootstrap 0
¿También en la ayuda de la search
línea de comando https://docs.docker.com/engine/reference/commandline/search/ , no hay ninguna pista de cómo puede funcionar?
¿Es posible en el comando de docker search
?
Si uso un comando sin formato para buscar a través de la API de registro de Docker , entonces la información puede ser captada
$ curl https://registry.hub.docker.com//v1/repositories/ubuntu/tags | python -mjson.tool
[
{
"layer": "ef83896b",
"name": "latest"
},
.....
{
"layer": "463ff6be",
"name": "raring"
},
{
"layer": "195eb90b",
"name": "saucy"
},
{
"layer": "ef83896b",
"name": "trusty"
}
]
Agregue esta función a su archivo .zshrc o ejecute el comando mannually
#usage list-dh-tags <repo>
#example: list-dh-tags node
function list-dh-tags(){
wget -q https://registry.hub.docker.com/v1/repositories/$1/tags -O - | sed -e ''s/[][]//g'' -e ''s/"//g'' -e ''s/ //g'' | tr ''}'' ''/n'' | awk -F: ''{print $3}''
}
gracias a esto -> ¿Cómo enumerar todas las etiquetas para una imagen de Docker en un registro remoto?
Cuando se utiliza CoreOS, jq
está disponible para analizar datos JSON.
Así que como lo estabas haciendo antes, mirando a la library/centos
admin@coreos ~/curl -s -S ''https://registry.hub.docker.com/v2/repositories/library/centos/tags/'' | jq ''."results"[]["name"]'' |sort
"6"
"6.7"
"centos5"
"centos5.11"
"centos6"
"centos6.6"
"centos6.7"
"centos7.0.1406"
"centos7.1.1503"
"latest"
La aplicación v2 limpiadora está disponible ahora, y eso es lo que estoy usando en el ejemplo. Construiré un script simple docker_remote_tags
#!/usr/bin/bash
curl -s -S "https://registry.hub.docker.com/v2/repositories/$@/tags/" | jq ''."results"[]["name"]'' |sort
Habilita:
$ ./docker_remote_tags library/centos
"6"
"6.7"
"centos5"
"centos5.11"
"centos6"
"centos6.6"
"centos6.7"
"centos7.0.1406"
"centos7.1.1503"
"latest"
Referencia:
jq
: https://stedolan.github.io/jq/ | apt-get install jq
Escribí una herramienta de línea de comandos para simplificar la búsqueda de etiquetas de reposición de DockerHub, disponible en mi repo de PyTools GitHub . Es simple de usar con varios interruptores de línea de comando, pero básicamente:
./dockerhub_show_tags.py repo1 repo2
Incluso está disponible como una imagen de acoplador y puede tomar varios repositorios:
docker run harisekhon/pytools dockerhub_show_tags.py centos ubuntu
DockerHub
repo: centos
tags: 5.11
6.6
6.7
7.0.1406
7.1.1503
centos5.11
centos6.6
centos6.7
centos7.0.1406
centos7.1.1503
repo: ubuntu
tags: latest
14.04
15.10
16.04
trusty
trusty-20160503.1
wily
wily-20160503
xenial
xenial-20160503
Si desea incrustar en scripts, use -q / --quiet para obtener solo las etiquetas, como los comandos normales de Docker:
./dockerhub_show_tags.py centos -q
5.11
6.6
6.7
7.0.1406
7.1.1503
centos5.11
centos6.6
centos6.7
centos7.0.1406
centos7.1.1503
Este script (docker-show-repo-tags.sh) debería funcionar para cualquier host habilitado para Docker.
#!/bin/sh
#
# Simple script that will display docker repository tags.
#
# Usage:
# $ docker-show-repo-tags.sh ubuntu centos
for Repo in $* ; do
curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$Repo/tags/" | /
sed -e ''s/,/,/n/g'' -e ''s//[//[/n/g'' | /
grep ''"name"'' | /
awk -F/" ''{print $4;}'' | /
sort -fu | /
sed -e "s/^/${Repo}:/"
done
Esta es la salida para el ejemplo de uso:
$ docker-show-repo-tags.sh ubuntu centos
ubuntu:14.04
ubuntu:14.04.3
ubuntu:15.04
ubuntu:15.10
ubuntu:latest
ubuntu:trusty
ubuntu:trusty-20151028
ubuntu:vivid
ubuntu:wily
ubuntu:wily-20151019
centos:5.11
centos:6.6
centos:6.7
centos:7.0.1406
centos:7.1.1503
centos:centos5.11
centos:centos6.6
centos:centos6.7
centos:centos7.0.1406
centos:centos7.1.1503
Hasta donde yo sé, la CLI no permite buscar / incluir etiquetas en un repositorio.
Pero si sabes qué etiqueta quieres, puedes extraerla explícitamente agregando dos puntos y el nombre de la imagen: docker pull ubuntu:saucy
La API v2 parece usar algún tipo de paginación, por lo que no devuelve todas las etiquetas disponibles. Esto es claramente visible en proyectos como python
(o library/python
). Incluso después de leer rápidamente la documentación , no pude trabajar con la API correctamente (tal vez sea la documentación incorrecta).
Luego reescribí el script usando la API v1, y aún usando https://stedolan.github.io/jq/ :
#!/bin/bash
repo="$1"
if [[ "${repo}" != */* ]]; then
repo="library/${repo}"
fi
url="https://registry.hub.docker.com/v1/repositories/${repo}/tags"
curl -s -S "${url}" | jq ''.[]["name"]'' | sed ''s/^"/(.*/)"$//1/'' | sort
El script completo está disponible en: https://bitbucket.org/denilsonsa/small_scripts/src/default/docker_remote_tags.sh
También escribí (en Python) una versión mejorada que agrega etiquetas que apuntan a la misma versión: https://bitbucket.org/denilsonsa/small_scripts/src/default/docker_remote_tags.py
No me gustó ninguna de las soluciones anteriores porque A. requirieron bibliotecas externas que no tenía y no deseaba instalar. B. no obtuvo todas las páginas.
La aplicación Docker te limita a 10 elementos por solicitud (no encontró la manera de cambiarla) , esto hará un bucle sobre cada elemento "siguiente" y los obtendrá todos (para Python son 44 páginas, el otro puede ser más o menos ... depende )
Si realmente quieres spam, quítate | cut -d ''-'' -f 1
| cut -d ''-'' -f 1
desde la última línea y verás absolutamente todo.
url=https://registry.hub.docker.com/v2/repositories/library/redis/tags/ `# Initial url` ; /
( /
while [ ! -z $url ]; do `# Keep looping until the variable url is empty` /
>&2 echo -n "." `# Every iteration of the loop prints out a single dot to show progress as it got through all the pages (this is inline dot)` ; /
content=$(curl -s $url | python -c ''import sys, json; data = json.load(sys.stdin); print(data.get("next", "") or ""); print("/n".join([x["name"] for x in data["results"]]))'') `# Curl the url and pipe the output to python, python will parse the JSON and print the very first line as the next url (it will leave it blank if there is no more pages) then continue to loop over the results extracting only the name; all will be stored in a variable called content` ; /
url=$(echo "$content" | head -n 1) `# Lets get the first line of content which contains the next url for the loop to continue` ; /
echo "$content" | tail -n +2 `# Print the content without the first line (yes +2 is counter intuitive)` ; /
done; /
>&2 echo `# Finally break the line of dots` ; /
) | cut -d ''-'' -f 1 | sort --version-sort | uniq;
Muestra de salida:
$ url=https://registry.hub.docker.com/v2/repositories/library/redis/tags/ `#initial url` ; /
> ( /
> while [ ! -z $url ]; do `#Keep looping until the variable url is empty` /
> >&2 echo -n "." `#Every iteration of the loop prints out a single dot to show progress as it got through all the pages (this is inline dot)` ; /
> content=$(curl -s $url | python -c ''import sys, json; data = json.load(sys.stdin); print(data.get("next", "") or ""); print("/n".join([x["name"] for x in data["results"]]))'') `# Curl the url and pipe the json to python, python will parse the JSON and print the very first line as the next url (it will leave it blank if there is no more pages) then continue to loop over the results extracting only the name; all will be store in a variable called content` ; /
> url=$(echo "$content" | head -n 1) `#Lets get the first line of content which contains the next url for the loop to continue` ; /
> echo "$content" | tail -n +2 `#Print the content with out the first line (yes +2 is counter intuitive)` ; /
> done; /
> >&2 echo `#Finally break the line of dots` ; /
> ) | cut -d ''-'' -f 1 | sort --version-sort | uniq;
..............
2
2.6
2.6.17
2.8
2.8.6
2.8.7
2.8.8
2.8.9
2.8.10
2.8.11
2.8.12
2.8.13
2.8.14
2.8.15
2.8.16
2.8.17
2.8.18
2.8.19
2.8.20
2.8.21
2.8.22
2.8.23
3
3.0
3.0.0
3.0.1
3.0.2
3.0.3
3.0.4
3.0.5
3.0.6
3.0.7
3.0.504
3.2
3.2.0
3.2.1
3.2.2
3.2.3
3.2.4
3.2.5
3.2.6
3.2.7
3.2.8
3.2.9
3.2.10
3.2.11
3.2.100
4
4.0
4.0.0
4.0.1
4.0.2
4.0.4
4.0.5
4.0.6
4.0.7
4.0.8
32bit
alpine
latest
nanoserver
windowsservercore
Si quieres la versión bash_profile
:
function docker-tags () {
name=$1
# Initial url
url=https://registry.hub.docker.com/v2/repositories/library/$name/tags/
(
# Keep looping until the variable url is empty
while [ ! -z $url ]; do
# Every iteration of the loop prints out a single dot to show progress as it got through all the pages (this is inline dot)
>&2 echo -n "."
# Curl the url and pipe the output to python, python will parse the JSON and print the very first line as the next url (it will leave it blank if there is no more pages)
# then continue to loop over the results extracting only the name; all will be stored in a variable called content
content=$(curl -s $url | python -c ''import sys, json; data = json.load(sys.stdin); print(data.get("next", "") or ""); print("/n".join([x["name"] for x in data["results"]]))'')
# Lets get the first line of content which contains the next url for the loop to continue
url=$(echo "$content" | head -n 1)
# Print the content without the first line (yes +2 is counter intuitive)
echo "$content" | tail -n +2
done;
# Finally break the line of dots
>&2 echo
) | cut -d ''-'' -f 1 | sort --version-sort | uniq;
}
Y simplemente llámalo: docker-tags redis
Muestra de salida:
$ docker-tags redis
..............
2
2.6
2.6.17
2.8
--trunc----
32bit
alpine
latest
nanoserver
windowsservercore
Para una secuencia de comandos que funciona con tokens de portador Oauth en dockerhub, intente esto
https://.com/a/38277663/2765671
Re-impl de publicación anterior, usando Python sobre sed / awk
for Repo in $* ; do
tags=$(curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$Repo/tags/")
python - <<EOF
import json
tags = [t[''name''] for t in json.loads(''''''$tags'''''')[''results'']]
tags.sort()
for tag in tags:
print "{}:{}".format(''$Repo'', tag)
EOF
done