Получить значение метки внутри контейнера

Каким образом работают метки в docker? Чтобы конкретизировать вопрос, я приведу пример.

version: '3'
services:
  flask:
    build: ./flask
    image: flask
    command: uwsgi --http-socket 0.0.0.0:5000 --wsgi-file app.py --callable app
    labels:
      - "traefik.enable=true"
      - "traefik.backend=flask"
      - "traefik.frontend.rule=${TRAEFIK_FRONTEND_RULE}"
  traefik:
    image: traefik:v1.7.24
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik/traefik.toml:/etc/traefik/traefik.toml:ro
      - ./traefik/acme:/etc/traefik/acme
    ports:
     - "80:80"
     - "443:443"
     - "8080:8080"

В traefik мы видим метки. Каким образом приложение внутри контейнера traefik узнаёт о метках. А самое главное, почему используются метки, а не переменные окружения? Какие задачи они выполняют?


Ответы (1 шт):

Автор решения: Roman Konoval

Вообще, метки нужны для того, чтобы легче управлять сущностями в docker. Т.е. выполнять такие задачи, как поиск контейнеров или сетей, когда их много. А не для того, чтобы передавать параметры внутрь контейнера.

Поясню на примере. Допустим есть приложение, которое состоит из трех контейнеров: web-ui, backend, storage. И допустим его запускают для 10 клиентов, т.е. у нас для каждого клиента запущено три контейнера.

Было бы удобно для каждого контейнера типа X (где Х одно из web-ui, backend, storage) создать метки:

  1. component=X
  2. customer=customerY

Тогда удобно делать команды

"показать все контейнеры клиента XYZ":

docker ps --filter "label=customer=XYZ"

Или показать все контейнеры типа backend:

docker ps --filter "label=component=backend"

Метки можно использовать не только для контейнеров, но и для образов, сетей и других сущностей.

traefik это сервис, который маршрутизирует запросы извне к соответствующим контейнерам. Он использует метки на контейнерах для этой маршрутизации. По сути с помощью меток задается конфигурация маршрутизации.

Эту конфигурацию можно было бы задать и с помощью переменных окружения traefik. Но конфигурация с использованием меток имеет некоторые преимущества:

  1. Проще искать контейнеры, которые находятся под управлением traefik.
  2. Конфигурация с помощью переменных окружения статична, и каждый запуск/останов контейнеров, потребует перезапуска контейнера traefik. Метки же привязаны к контейнеру. Если контейнер остановить - то и соответствующая конфигурация автоматически пропадает. А чтоб изменить конфигурацию достаточно перезапустить контейнер с указанием новых значений меток (а в будущем вероятно появится возможность просто изменить метку).

Приложение из traefik получает метки с других запущенных контейнеров обращаясь к сервису docker используя API, которое docker предоставляет.

→ Ссылка