Инструмент меток Docker для просмотра удаленных складов

Docker Kubernetes

задний план

Недавно я вошел в яму докера, Например, если вы хотите запустить эластичный контейнер локально, вы можете быстро запустить экземпляр elasticsearch напрямую с помощью следующей команды.

docker run -d -p 9200:9200 \
    -p 9300:9300 \
    --name elasticsearch001 -h elasticsearch001 \
    -e cluster.name=lookout-es \
    -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
    -e xpack.security.enabled=false \
    elasticsearch/elasticsearch

воплощать в жизньdocker runПоследним параметром команды является имя изображения.Registry/Repository/Image:tagПравила, смысл каждой части следующий

  • Реестр: единый адрес реестра Docker компании.
  • Репозиторий: репозиторий изображений, используемый для управления классом изображений.
  • Изображение: имя определенного изображения.
  • тег: тег определенного изображения.

Когда мы выполним приведенную выше команду, мы фактически перейдем к реестру по умолчанию (концентратор докеров), чтобы получить изображение, имя репозитория которого — elasticsearch, а имя изображения — elasticsearch.В образе может быть несколько версий тегов, которые будут извлечены по умолчанию. Возьмите изображение, тег которого является последним. Проблема с Реестром/Репозиторием/Образом здесь невелика, и их легко найти, но в целом, какие версии образа существуют, пользователям сложно найти, Раньше я заходил на dockerhub и полистал все теги страница за страницей.Такая ситуация менее эффективна. Позднее авторHow to list all tags for a Docker image on a remote registry? Я нашел хороший ответ.Основная идея заключается в том, чтобы использовать интерфейс API, официально предоставленный докером, для запроса указанного изображения.После обработки данных интерфейса можно получить все теги.Автор считает, что это интересно писать, поэтому я буду анализировать it., промежуточный процесс должен использовать sed, awk и другие связанные знания. Код dockertags.sh выглядит следующим образом:

#!/bin/bash
function usage() {
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
}



if [ $# -lt 1 ]; then
	usage
	exit
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}"

Он используется следующим образом:

  1. dockertags ubuntu: список всех тегов зеркала ubuntu
    image
  2. dockertags php apache: список всех тегов изображений php, содержащих apache.
    image

Анализ реализации

пройти через$# -lt 1Определите, имеет ли оболочка менее одного параметра ($#Указывает количество параметров оболочки), если их меньше одного, выполнить функцию использования, вывести некоторую справочную информацию и выйти из программы. Продолжайте выполнение, если оно больше или равно одному параметру.

$1: указывает первый параметр в оболочке,dockertags ubuntuВ 1 долларе стоит убунту

wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -: имя образа будет вставлено в интерфейс API запросов для формирования https://registry.hub.docker.com/v1/repositories/ubuntu/tags, а результат запроса будет получен при доступе к этому интерфейсу через wget.-qПараметр отключит избыточный вывод wget,-O -Параметр позволяет отображать результат доступа wget в командной строке следующим образом:

image
Затем используйте sed для обработки полученного json. sed -e означает выполнение скрипта, за которым следуют несколько параметров -e. Объяснение каждой части выглядит следующим образом:

  • -e 's/[][]//g': означает удаление квадратных скобок до и после результата json
  • -e 's/"//g': означает удаление двойных кавычек в результате json
  • -e 's/ //g': означает удаление пробелов в json

Результат после обработки sed выглядит следующим образом:

После обработки sed замените закрывающую фигурную скобку json новой строкой через tr, и результат будет следующим:

image

Наконец, укажите через awk, чтобы указать каждый разделитель полей через параметр -F как:Разделите каждую строку данных на три части:

image
'{print $3}'Непосредственный вывод третьего столбца результатов — это список тегов нужного нам зеркала, как показано ниже:
image

На данный момент переменная tags сохранила все списки тегов, относящиеся к текущему изображению.

Если второй параметр в оболочке не пуст, это означает, что требуется дальнейшая фильтрация на основе второго параметра, напримерdockertags php apache,В настоящее время$2Это apache, нам нужно отфильтровать все теги php-зеркала, содержащие теги apache, и добавить grep напрямую через пайплайн,echo "${tags}" | grep "$2", Сначала выполните подстановку переменных, затем выполните команду. Наконец, выведите список всех тегов, удовлетворяющих условиям.