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

Что такое метки 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, обеспечивая более упорядоченное управление.