Docker, лекция 13. Метаданные
Когда контейнеры запущены в продакшене важно добавлять дополнительные метаданные, которые помогут в управлении ими. Например: версия запущенного в контейнера кода, список приложений или права пользователей.
Метаданные управляются Docker Labels, которые позволяют установить пользовательские метаданные для контейнера или образа, которые могут быть потом отфильтрованы или просто прочитаны.
Контейнеры
Label может быть прикреплен к контейнеру когда он запускается командой docker run. Контейнер может иметь несколько labels.
Для добавления label используется команда -l. В примере ниже устанавливается label с именем user с значением.
docker run -l user=12345 -d redis
Если вы добавляете несколько label, они могут быть получены из внешнего файла. Файл должен иметь label в каждой строке, а затем они будут прикреплены к работающему контейнеру.
Для использования файла используется команда —label-file=<имя_файла>.
Создадим файл labels с данными:
echo 'user=123461' >> labels && echo 'role=cache' >> labels
И прикрепим:
docker run --label-file=labels -d redis
Images
С образами всё работает похожим способом, только определение label происходит в Dockerfile.
Для добавления label с именем vendor нужно добавить строчку ниже в Dockerfile:
LABEL vendor=Katacoda
Если необходимо добавить несколько значений, то запись нужно добавлять такого вида:
LABEL vendor=Katacoda \ com.katacoda.version=0.0.5 \ com.katacoda.build-date=2016-07-01T10:47:29Z \ com.katacoda.course=Docker
Просмотр
Для просмотра добавленной информации используется docker inspect. Для примера был создан контейнер rd и образ katakoda-label-example. Чтобы получить label контейнера rd выполним:
docker inspect rd
Однако это не удобно — выдается вся информация о контейнере, а нам нужна только маленькая часть информации. Для этого есть параметр -f, который позволяет фильтровать JSON ответ. В примере ниже выберем только label.
docker inspect -f "{{json .Config.Labels }}" rd
С просмотром информации образов отличий почти нет, только вместо .Config.Labels используется .ContainerConfig.Labels:
docker inspect -f "{{json .ContainerConfig.Labels }}" katacoda-label-example
Если так получилось, что у образа нет имени — можно использовать вместо имени <none>.
Фильтрация
Когда речь идет не о паре контейнеров, а о сотнях, то такой вариант получения информации не очень удобен. Для этого есть фильтрация контейнеров ключом —filter для docker ps.
docker ps --filter "label=user=scrapbook"
А для образов:
docker images --filter "label=vendor=Katacoda"
Важно помнить что поиск чувствителен к регистру текста. Поэтому лучше не использовать большие буквы.
Label для Docker демона\службы
Данная команда может понадобиться для, например, пометки продакшн или тестового Docker.
В дальнейших уроках будет подробнее показаны примеры конфигурации самого Docker, но пока только про label:
docker -d \
-H unix:///var/run/docker.sock \
--label com.katacoda.environment="production" \
--label com.katacoda.storage="ssd"