Получить значение метки внутри контейнера
Каким образом работают метки в 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 шт):
Вообще, метки нужны для того, чтобы легче управлять сущностями в docker. Т.е. выполнять такие задачи, как поиск контейнеров или сетей, когда их много. А не для того, чтобы передавать параметры внутрь контейнера.
Поясню на примере. Допустим есть приложение, которое состоит из трех контейнеров: web-ui, backend, storage. И допустим его запускают для 10 клиентов, т.е. у нас для каждого клиента запущено три контейнера.
Было бы удобно для каждого контейнера типа X (где Х одно из web-ui, backend, storage) создать метки:
component=Xcustomer=customerY
Тогда удобно делать команды
"показать все контейнеры клиента XYZ":
docker ps --filter "label=customer=XYZ"
Или показать все контейнеры типа backend:
docker ps --filter "label=component=backend"
Метки можно использовать не только для контейнеров, но и для образов, сетей и других сущностей.
traefik это сервис, который маршрутизирует запросы извне к соответствующим контейнерам. Он использует метки на контейнерах для этой маршрутизации. По сути с помощью меток задается конфигурация маршрутизации.
Эту конфигурацию можно было бы задать и с помощью переменных окружения traefik. Но конфигурация с использованием меток имеет некоторые преимущества:
- Проще искать контейнеры, которые находятся под управлением
traefik. - Конфигурация с помощью переменных окружения статична, и каждый запуск/останов контейнеров, потребует перезапуска контейнера
traefik. Метки же привязаны к контейнеру. Если контейнер остановить - то и соответствующая конфигурация автоматически пропадает. А чтоб изменить конфигурацию достаточно перезапустить контейнер с указанием новых значений меток (а в будущем вероятно появится возможность просто изменить метку).
Приложение из traefik получает метки с других запущенных контейнеров обращаясь к сервису docker используя API, которое docker предоставляет.