Как найти образ Docker с определенным тегом в реестре Docker в командной строке Docker?

Я пытаюсь найти один конкретный тег для образа Docker. Как я могу сделать это в командной строке? Я хочу избежать загрузки всех изображений и последующего удаления ненужных.

В официальном выпуске Ubuntu https://registry.hub.docker.com/_/ubuntu/, есть несколько тегов (релиз для него), а когда я ищу его в командной строке,

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

Также в справке командной строки search https://docs.docker.com/engine/reference/commandline/search/, не знаете, как это работает?

Возможно ли это в команде docker search?

Если я использую необработанную команду для поиска через API реестра Docker, то информацию можно получить:

   $ 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"
    }
]

person Larry Cai    schedule 30.06.2014    source источник


Ответы (11)


Насколько мне известно, CLI не позволяет искать/выводить теги в репозиторий.

Но если вы знаете, какой тег вам нужен, вы можете получить его явно, добавив двоеточие и имя изображения: docker pull ubuntu:saucy

person Abel Muiño    schedule 30.06.2014
comment
знаете ли вы какие-либо проблемы в github, связанные с этим? - person Larry Cai; 04.07.2014
comment
@LarryCai Нет, и при быстром поиске я ничего не нашел. - person Abel Muiño; 04.07.2014
comment
Я добавил это в предложение по новому API реестра: Предложение: JSON Registry API V2.1 · Проблема #9015 · докер/докер - person nealmcb; 11.12.2014

При использовании CoreOS jq доступен для анализа данных JSON.

Итак, как вы делали раньше, глядя на library/centos:

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

Более чистый API версии 2 уже доступен, и я использую его в этом примере. Я соберу простой скрипт docker_remote_tags:

#!/usr/bin/bash
curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$@/tags/" | jq '."results"[]["name"]' |sort

Включает:

$ ./docker_remote_tags library/centos
"6"
"6.7"
"centos5"
"centos5.11"
"centos6"
"centos6.6"
"centos6.7"
"centos7.0.1406"
"centos7.1.1503"
"latest"

Справка:

jq: https://stedolan.github.io/jq/ | apt-get install jq

person shadowbq    schedule 17.09.2015
comment
Моя версия jq (jq-1.4-1-e73951f в Fedora 22) требует результатов без кавычек. т.е. jq '.результаты[][имя]' - person kwart; 06.10.2015
comment
Я объединил приведенный выше пример и этот пример. В результате был создан следующий docker-образ. - person Pawel; 06.04.2017
comment
Это позволит получить только последние 10 тегов — он не покажет вам ничего более старого, что не вписывается в первые 10 элементов. - person Javier Buzzi; 12.12.2018
comment
@kwart вы можете получить результат без кавычек, используя флаг -r jq - person Aswath K; 01.05.2019

Мне не понравилось ни одно из приведенных выше решений, потому что а) они требовали внешних библиотек, которых у меня не было и которые я не хотел устанавливать. Б) Я не получил все страницы.

Docker API ограничивает вас 100 элементами на запрос. Это будет циклически перебирать каждый «следующий» элемент и получать их все (для Python это семь страниц; другие могут быть больше или меньше... это зависит)

Если вы действительно хотите спамить сами, уберите | cut -d '-' -f 1 из последней строки, и вы увидите абсолютно все.

url=https://registry.hub.docker.com/v2/repositories/library/redis/tags/?page_size=100 `# 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 are 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) `# Let's 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;

Пример вывода:

$ url=https://registry.hub.docker.com/v2/repositories/library/redis/tags/?page_size=100 `#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 are 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) `#Let's 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

Если вы хотите версию bash_profile:

function docker-tags () {
  name=$1
  # Initial URL
  url=https://registry.hub.docker.com/v2/repositories/library/$name/tags/?page_size=100
  (
    # 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 are 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"]]))')
      # Let's 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;
}

И просто назовите это: docker-tags redis

Пример вывода:

$ docker-tags redis
...
2
2.6
2.6.17
2.8

--trunc----

32bit
alpine
latest
nanoserver
windowsservercore
person Javier Buzzi    schedule 22.02.2018
comment
обратите внимание, что для этого требуется python. ... (A) им требовались внешние библиотеки - person shadowbq; 08.01.2020
comment
@shadowbq За последние 10 лет я не видел коробки * nix, в которой не был бы установлен python. - person Javier Buzzi; 28.05.2020

Этот скрипт (docker-show-repo-tags.sh) должен работать на любом хосте с поддержкой Docker, у которого есть curl, sed, grep и sort. Это было обновлено, чтобы отразить тот факт, что URL-адреса тегов репозитория изменились.

#!/bin/sh
#
# Simple script that will display Docker repository tags
# using basic tools: curl, sed, grep, and sort.
#
# Usage:
#   $ docker-show-repo-tags.sh ubuntu centos
for Repo in $* ; do
    curl -sS "https://hub.docker.com/r/library/$Repo/tags/" | \
        sed -e $'s/"tags":/\\\n"tags":/g' -e $'s/\]/\\\n\]/g' | \
        grep '^"tags"' | \
        grep '"library"' | \
        sed -e $'s/,/,\\\n/g' -e 's/,//g' -e 's/"//g' | \
        grep -v 'library:' | \
        sort -fu | \
        sed -e "s/^/${Repo}:/"
done

Эта старая версия больше не работает.

#!/bin/sh
# WARNING: This no long works!
# 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

Это вывод для простого примера:

$ docker-show-repo-tags.sh centos | cat -n
     1    centos:5
     2    centos:5.11
     3    centos:6
     4    centos:6.10
     5    centos:6.6
     6    centos:6.7
     7    centos:6.8
     8    centos:6.9
     9    centos:7.0.1406
    10    centos:7.1.1503
    11    centos:7.2.1511
    12    centos:7.3.1611
    13    centos:7.4.1708
    14    centos:7.5.1804
    15    centos:centos5
    16    centos:centos5.11
    17    centos:centos6
    18    centos:centos6.10
    19    centos:centos6.6
    20    centos:centos6.7
    21    centos:centos6.8
    22    centos:centos6.9
    23    centos:centos7
    24    centos:centos7.0.1406
    25    centos:centos7.1.1503
    26    centos:centos7.2.1511
    27    centos:centos7.3.1611
    28    centos:centos7.4.1708
    29    centos:centos7.5.1804
    30    centos:latest
person Joe Linoff    schedule 02.12.2015
comment
Я предпочитаю использовать jshon: curl -s -S "https://registry.hub.docker.com/v2/repositories/library/centos/tags/" | jshon -e results -a -e name -u Но ваш лучше использовать встроенные инструменты - person frogstarr78; 13.04.2016
comment
ваша команда показывает только ➜ ~ docker-show-repo-tags.sh ubuntu ubuntu:next ➜ ~ docker-show-repo-tags.sh nginx nginx:next - person Viky Leaf; 11.09.2016
comment
Спасибо @viky за указание на то, что пример не работает. Я обновил его. - person Joe Linoff; 31.08.2018

Я написал инструмент командной строки для упрощения поиска тегов репозитория Docker Hub, доступный в моем репозитории PyTools GitHub. Его просто использовать с различными переключателями командной строки, но в основном:

./dockerhub_show_tags.py repo1 repo2

Он даже доступен в виде образа Docker и может содержать несколько репозиториев:

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

Если вы хотите встроить его в скрипты, используйте -q/--quiet, чтобы получить только теги, как обычные команды 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
person Hari Sekhon    schedule 25.05.2016
comment
Образ Docker работал для меня как шарм. Кажется, очень сложно получить полный список изображений каким-либо другим способом через центральный сайт Docker, поэтому этот сценарий был идеальным. - person barnyr; 28.02.2017

API v2, похоже, использует какую-то разбивку на страницы, поэтому он не возвращает все доступные теги. Это хорошо заметно в таких проектах, как python (или library/python). Даже после быстрого прочтения документации я не смог справиться для корректной работы с API (возможно неправильная документация).

Затем я переписал скрипт, используя v1 API, и он по-прежнему использует 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

Полный сценарий доступен по адресу: https://github.com/denilsonsa/small_scripts/blob/master/docker_remote_tags.sh

Я также написал улучшенную версию (на Python), которая объединяет теги, указывающие на одну и ту же версию: https://github.com/denilsonsa/small_scripts/blob/master/docker_remote_tags.py

person Denilson Sá Maia    schedule 19.03.2016

Добавьте эту функцию в свой файл .zshrc или запустите команду вручную:

#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}'
}

Благодаря этому -> Как вывести список всех тегов образа Docker в удаленном реестре?

person Helder Dias    schedule 19.07.2018

Повторная реализация предыдущего поста с использованием Python вместо 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
person Chris Cheetham    schedule 19.02.2016
comment
Разве не принято располагать операторы import вверху? - person Peter Mortensen; 11.12.2018
comment
Импорт находится вверху… скрипта Python. Читайте внимательно, Крис использовал синтаксис здесь-doc. Поэтому он сначала использует bash (withcurl), затем python. Я не понимаю, почему он не сделал все это на питоне. - person Cyrille Pontvieux; 23.04.2019

Для сценария, который работает с токенами носителя OAuth в Docker Hub, попробуйте следующее:

Вывод списка тегов образа Docker в концентраторе Docker через HTTP API

person Mark Riggins    schedule 09.07.2016

Вы можете использовать Visual Studio Code, чтобы обеспечить автозаполнение для доступных образов и тегов Docker. Однако для этого необходимо ввести первую букву тега, чтобы увидеть предложения автозаполнения.

Например, при написании FROM ubuntu он предлагает варианты автозаполнения, такие как ubuntu, ubuntu-debootstrap и ubuntu-upstart. При написании FROM ubuntu:a он предлагает варианты автозаполнения, например ubuntu:artful и ubuntu:artful-20170511.1.

person hpgmiskin    schedule 28.03.2019

Для тех, кто сталкивается с этим в наше время, вы можете использовать Skopeo для извлечения тегов образа из реестра Docker. :

$ skopeo list-tags docker://jenkins/jenkins \
| jq -r '.Tags[] | select(. | contains("lts-alpine"))' \
| sort --version-sort --reverse

lts-alpine
2.277.3-lts-alpine
2.277.2-lts-alpine
2.277.1-lts-alpine
2.263.4-lts-alpine
2.263.3-lts-alpine
2.263.2-lts-alpine
2.263.1-lts-alpine
2.249.3-lts-alpine
2.249.2-lts-alpine
2.249.1-lts-alpine
2.235.5-lts-alpine
2.235.4-lts-alpine
2.235.3-lts-alpine
2.235.2-lts-alpine
2.235.1-lts-alpine
2.222.4-lts-alpine
person Nev Stokes    schedule 21.04.2021