задний план
Недавно я вошел в яму докера, Например, если вы хотите запустить эластичный контейнер локально, вы можете быстро запустить экземпляр 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}"
Он используется следующим образом:
-
dockertags ubuntu: список всех тегов зеркала ubuntu -
dockertags php apache: список всех тегов изображений php, содержащих apache.
Анализ реализации
пройти через$# -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 в командной строке следующим образом:
-
-e 's/[][]//g': означает удаление квадратных скобок до и после результата json -
-e 's/"//g': означает удаление двойных кавычек в результате json -
-e 's/ //g': означает удаление пробелов в json
Результат после обработки sed выглядит следующим образом:
После обработки sed замените закрывающую фигурную скобку json новой строкой через tr, и результат будет следующим:
Наконец, укажите через awk, чтобы указать каждый разделитель полей через параметр -F как:Разделите каждую строку данных на три части:
'{print $3}'Непосредственный вывод третьего столбца результатов — это список тегов нужного нам зеркала, как показано ниже:На данный момент переменная tags сохранила все списки тегов, относящиеся к текущему изображению.
Если второй параметр в оболочке не пуст, это означает, что требуется дальнейшая фильтрация на основе второго параметра, напримерdockertags php apache,В настоящее время$2Это apache, нам нужно отфильтровать все теги php-зеркала, содержащие теги apache, и добавить grep напрямую через пайплайн,echo "${tags}" | grep "$2", Сначала выполните подстановку переменных, затем выполните команду. Наконец, выведите список всех тегов, удовлетворяющих условиям.