Поиск по сайту:

Как стать опытным пользователем Docker CLI с помощью «–format» и шаблонов вывода


Использование интерфейса командной строки Docker для составления списка и проверки ресурсов в вашей системе часто приводит к подробным выводам, которые могут скрывать важные детали. Docker поддерживает синтаксис шаблонов Go в сочетании с флагом --format, чтобы дать вам контроль над тем, что отображается.

Изучение того, как использовать шаблоны, может превратить вас в опытного пользователя Docker CLI. Они позволяют эффективно выбирать и преобразовывать выходные данные команд для создания необходимых представлений. Это приводит к более продуктивной работе с интерфейсом командной строки и сокращению времени, затрачиваемого на сканирование длинных строк консоли.

Какие команды поддерживают «–format»?

Флаг --format поддерживается наиболее часто используемыми командами docker. Вы можете использовать его с docker inspect и командами, создающими списки элементов, например docker ps, docker images и docker volumes. .

Когда вы включаете флаг --format, Docker отправит вывод команды через предоставленную вами строку шаблона Go. Вы можете использовать функции шаблонов, предоставляемые Go, для использования заполнителей, установленных Docker. Это дает вам доступ к данным, полученным CLI.

Основной пример

Запуск docker inspect в контейнере отображает длинный объект JSON, который обычно переполняет окно терминала. Используя --format, вы можете извлечь определенные части данных, которые вас интересуют. Вот пример, который показывает статус контейнера, PID и время запуска:

~$ docker inspect 94a8d1315315 --format '{{.State.Status}} (PID: {{.State.Pid}}) {{.State.StartedAt}}'
running (PID: 1488278) 2022-03-22T20:45:58.614115689Z

Гораздо проще определить целевые значения с помощью шаблона, чем вручную просматривать необработанный JSON.

Доступ к выходным значениям

Динамические части вашего шаблона заключаются в двойные фигурные скобки. Вы можете ссылаться на значения в выводе команды Docker, используя синтаксис {{.Field}}. Field должно быть именем свойства в JSON-представлении этого вывода. Вложенные поля выбираются с использованием связанного синтаксиса, аналогичного доступу к свойствам в JavaScript, .Field.NestedValue.

Вы можете определить, какие поля доступны, просмотрев необработанный вывод команды. docker inspect по умолчанию отображает JSON; это можно напрямую сопоставить с заполнителями синтаксиса шаблона. Для других команд, таких как ps и images, вы можете получить базовую структуру JSON, используя специальный шаблон:

docker ps --format '{{json .}}`

Функция json отображает необработанную версию предоставленных вами данных в формате JSON.

Простые преобразования

Функции преобразования предлагают удобный способ манипулирования значениями. upper и lower преобразуют строки в верхний и нижний регистр соответственно. Вы можете применить регистр заголовка к строке с помощью title. Функции вставляются в шаблон перед значением, над которым они работают:

~$ docker inspect 94a8d1315315 --format '{{upper .State.Status}} (PID: {{.State.Pid}})'
RUNNING (PID: 1488278)

Если вы хотите добавить символ новой строки между значениями, используйте функцию println:

~$ docker inspect 94a8d1315315 --format '{{.State.Status}} {{.State.Pid}}{{println}}{{.State.StartedAt}}'
running 1488278
2022-03-22T20:45:58.614115689Z

Работа с массивами

Синтаксис шаблона имеет встроенную поддержку итерации элементов массива. Функция range перебирает значения массива и устанавливает переменную . для каждого из них:

~$ docker inspect 94a8d1315315 --format '{{range .Mounts}}{{println .Destination}}{{end}}'
/config
/data

Вы можете комбинировать элементы массива с помощью функции join:

~$ docker inspect 94a8d1315315 --format '{{join .Config.Cmd " "}}'
caddy run --config /etc/caddy/Caddyfile --adapter caddyfile

Это создает строку, которая включает каждое значение в массиве. Элементы объединяются вместе с текстом, указанным в качестве второго параметра аргумента.

Табуляция вывода

Многие команды Docker по умолчанию отображают данные в удобочитаемом виде таблицы. Вы можете создавать свои собственные таблицы, используя специальный компонент шаблона table.

Используйте символы t, чтобы разделить поля данных на столбцы таблицы. Шаблон будет выполняться для каждого из элементов, включенных в вывод команды Docker CLI. Размер столбцов таблицы автоматически изменяется в соответствии с длиной их содержимого.

~$ docker images --format 'table {{.ID}}\t{{.Tag}}\t{{.Size}}'
IMAGE ID       TAG          SIZE
ede20431e41f   caddy        40.4MB
e5179b119094   <none>       40.4MB

Docker автоматически включает соответствующие заголовки столбцов для полей в вашем шаблоне.

Условное форматирование

Шаблоны также поддерживают условные операторы «если». Вы можете динамически настраивать вывод команды, отображая другое значение в зависимости от условия:

~$ docker ps --format '{{.ID}} {{if eq .State "running"}}Alive{{else}}Not Running{{end}}'
94a8d1315315 Alive

Этот шаблон отображает либо Активный, либо Не запущенный в зависимости от того, установлено ли в поле State каждого контейнера значение running. За блоком if следует значение, которое отображается при совпадении условия. После этого можно связать необязательный блок else. Условие завершается ключевым словом {{end}}.

Шаблоны Go понимают несколько операторов сравнения. Показанный выше eq проверяет, равно ли первое значение второму. Дополнительно доступны следующие опции:

  • ne — сравнение «не равно».
  • lt — сравнение «меньше чем» (<).
  • lte — сравнение «меньше или равно» (<=)).
  • gt — сравнение «больше чем» (>).
  • gte — сравнение «больше или равно» (>=)).

Также есть ключевые слова и, или и не для объединения условий в сложные выражения.

Расширенное форматирование с использованием JQ

Флаг --format в основном используется для создания удобочитаемых выходных строк. Если вам удобнее проверять необработанный JSON, вы можете использовать другие инструменты, такие как jq, для более прямого управления выводом Docker. Это может быть полезно, если вы хотите создать более сложные запросы, чем могут предоставить только шаблоны Go.

docker inspect по умолчанию создает JSON, поэтому его вывод можно передать прямо в jq:

~$ docker inspect 94a8d1315315 | jq .[0].Config.Cmd
[
  "caddy",
  "run",
  "--config",
  "/etc/caddy/Caddyfile",
  "--adapter",
  "caddyfile"
]

Вывод других команд должен быть преобразован в необработанный JSON с помощью --format, прежде чем он будет передан в jq:

~$ docker images --format '{{json .}}' | jq .Size
"968MB"
"946MB"
"40.1MB"

Jq предоставляет собственный синтаксис для выбора, обработки и форматирования данных JSON. Основы аналогичны заполнителям шаблонов Go. На поля ссылаются с использованием синтаксиса .Field. Существует поддержка выбора элементов массива с использованием нотации .[index].

Заключение

Интерфейс командной строки Docker становится более мощным, когда вы можете выборочно просматривать выходные данные и управлять ими. Шаблоны Go с флагом --format позволяют создавать настраиваемые интерфейсы, которые упрощают управление вашими контейнерами.

В некоторых ситуациях --format все еще может не обеспечивать необходимой мощности и гибкости. Передача команд Docker внешним инструментам, таким как jq, предоставляет еще один способ быстрого опроса вашей установки и отображения ее данных в других системах.