Что такое метки Docker и когда их следует использовать?
Метки Docker позволяют прикреплять произвольные метаданные к вашим контейнерам, изображениям, томам и другим ресурсам. Вы можете пометить свои объекты Docker информацией, относящейся к вашей организации, рабочему процессу или набору инструментов.
Метки предназначены для использования в качестве открытой системы классификации, которую вы можете адаптировать к своим потребностям. Вот как создавать новые метки и использовать их для фильтрации объектов, возвращаемых интерфейсом командной строки Docker.
Поддерживаемые типы объектов
Вы можете использовать метки со следующими объектами Docker:
- Контейнеры
- Изображения
- Тома
- Сети
- Экземпляры демона
- Рой узлов и сервисов
Каждый тип объекта поддерживает метки как часть своей группы команд CLI. Неважно, используете ли вы docker image
, docker network
или docker volume
.
Добавление ярлыков
Метки добавляются во время создания объекта. Их нельзя изменить после первоначального создания; вам необходимо удалить объект и заменить его новой версией, если необходимы изменения. Исключением являются метки, назначенные узлам и сервисам Docker Swarm, которые могут динамически обновляться в любое время.
Флаг --label
используется для установки меток. Каждая метка представляет собой пару ключ-значение, где ключ и значение разделены знаком равенства (=
):
docker run my-image:latest --label demo-label=example-value
Ключи меток могут содержать строчные буквенно-цифровые символы, точки (.
) и дефисы (-
). Они должны начинаться и заканчиваться буквенно-цифровым символом. Соблюдаются правила нотации DNS, поэтому использование нескольких последовательных точек и дефисов запрещено.
Docker принимает любую строку в качестве значения метки, но помните, что сериализация или приведение не происходит. Сложные значения, такие как JSON или XML, будут храниться и извлекаться в виде простой строки.
Лучшие практики для ярлыков
Docker предлагает некоторые рекомендации по именованию ваших меток, которые улучшают взаимодействие в экосистеме. Он рекомендует использовать метки пространства имен с использованием обратной нотации DNS, которую предпочитают магазины приложений и менеджеры пакетов:
docker run my-image:latest --label=com.example.demo-label=example-value
Эта практика помогает избежать конфликтов имен ключей, когда метки устанавливаются инструментами в вашей системе сборки. Многие средства автоматизации добавляют свои собственные метки к объектам Docker, которые они создают, чтобы облегчить отслеживание и управление. Docker не поддерживает повторяющиеся ключи меток, и использование одного и того же ключа дважды приводит к использованию значения последнего повторения.
Docker резервирует некоторые пространства имен для внутреннего использования CLI. Вы не должны добавлять к своим ключам префикс любого из следующих пространств имен:
com.docker.*
io.docker.*
org.dockerproject.*
Добавляйте префикс ко всем ярлыкам с собственным доменным именем, если нет веских причин не делать этого. Интерфейс командной строки Docker не требует соблюдения каких-либо рекомендаций, но их соблюдение помогает свести к минимуму риск непреднамеренной перезаписи общего ключа, такого как name
или version
.
Проверка этикеток
Команда docker inspect
включает в свой вывод список назначенных меток. Это работает с контейнерами и образами, идентифицированными по идентификатору или имени. Доступ к меткам, используемым с сетями и томами, осуществляется с помощью подкоманды inspect
этих групп CLI, например docker network inspect my-network
.
Вывод docker inspect
может быть трудно переварить как есть. Раздел labels будет скрыт в JSON, отправленном на ваш терминал. Вы можете использовать флаг --format
для просмотра меток по отдельности. Если выбрать JSON в качестве выходного формата и передать полученную строку через jq
, вы получите раскрашенный список меток для удобства чтения.
docker inspect my-container --format='{{json .Config.Labels}}' | jq
Фильтрация списков объектов
Команды интерфейса командной строки Docker, такие как docker ps
и docker images
, которые создают список объектов, можно отфильтровать, чтобы отображались только элементы с заданным набором меток.
Вот как отобразить контейнеры с меткой demo
, установленной на example
:
docker ps --filter "label=com.example.demo=example"
Если вы хотите отфильтровать несколько меток, повторите флаг --filter
:
docker ps --filter "label=a=1" --filter "label=b=2"
Иногда может потребоваться отобразить все объекты с заданной меткой. Для этого укажите имя ключа метки, но опустите значение:
docker ps --filter "label=com.example.demo"
Любой контейнер с меткой com.example.demo
будет включен в выходные данные команды, независимо от значения, присвоенного метке.
Характеристики этикетки
Спецификация контейнеров OCI определяет несколько обычных меток, которые инкапсулируют общие варианты использования образов контейнеров. Они существуют в пространстве имен org.opencontainers.image
.
org.opencontainers.image.created
— время создания образа.org.opencontainers.image.url
— URL для получения информации об изображении.org.opencontainers.image.version
— версия основного программного обеспечения внутри контейнера (не версия образа).org.opencontainers.image.licenses
— информация о лицензировании контейнера.org.opencontainers.image.title
– удобное для восприятия имя контейнера.
Вы можете просмотреть полный список меток OCI в спецификации. Рекомендуется использовать метки OCI, если вы обнаружите, что добавляете какую-либо подобную информацию к своим изображениям. Они помогают сделать ваше изображение совместимым с инструментами сообщества, которые выявляют и фильтруют эти метаданные.
Добавление меток во время сборки образа
Вы можете установить метки во время сборки образа, используя инструкцию LABEL
в вашем Dockerfile. Метки будут применяться к изображению, а не к контейнерам, начатым с него. Изображения также наследуют любые метки, определенные их родителями. Слой, который устанавливает метку, которая уже была создана более ранним слоем, переопределит исходное значение.
LABEL com.example.demo=example com.example.example=demo LABEL com.example.image=service
Вы можете объединить несколько меток в одну инструкцию LABEL
или повторить инструкцию несколько раз. Эффект одинаков независимо от того, что все метки в конечном итоге будут включены в ваше изображение.
Краткое содержание
Метки — это механизм добавления собственных метаданных к объектам Docker. Хотя метки преднамеренно произвольные и открытые, вы должны стараться следовать спецификациям OCI при настройке часто используемых полей.
Установка меток позволяет прикреплять любую дополнительную информацию, которая может иметь отношение к объекту. Определение набора эталонных меток в вашей организации позволит любому запускать docker inspect
для получения важных сведений о контейнере вместо перекрестных ссылок на внешнюю документацию. Метки также позволяют фильтровать выходные данные Docker CLI, обеспечивая более упорядоченное управление.