Разбивка по контейнерам (CPU/память/сеть) — то, что не смог дать
cAdvisor из-за несовместимости с containerd-снапшоттером сервера 1gb
(убран в 7f5c888). Свой минимальный сервис container-exporter (Python/
aiohttp/prometheus_client) опрашивает Docker Engine API параллельно в
фоновой задаче, не завязываясь на scrape-интервал Prometheus.
Доступ к докер-сокету изолирован через docker-socket-proxy: экспортеру
разрешены только GET /containers/json и /containers/*/stats, любые
изменяющие запросы блокируются на уровне прокси (POST=0) — полная
компрометация экспортера не даёт управлять Docker. Ни один из двух
сервисов не публикует портов наружу.
В host.json возвращены панели «Топ контейнеров по CPU/памяти» на новых
метриках vidconf_container_* (в 0.0.9 их убрали вместе с cAdvisor).
33 lines
1.4 KiB
Docker
33 lines
1.4 KiB
Docker
FROM python:3.12-slim AS base
|
||
|
||
# uv binary (тот же приём, что и backend/Dockerfile).
|
||
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/
|
||
|
||
WORKDIR /app
|
||
|
||
ENV UV_COMPILE_BYTECODE=1 \
|
||
UV_LINK_MODE=copy \
|
||
PYTHONUNBUFFERED=1
|
||
|
||
COPY pyproject.toml uv.lock ./
|
||
RUN uv sync --frozen --no-dev --no-install-project
|
||
|
||
COPY exporter.py ./
|
||
|
||
# Непривилегированный пользователь — сокет Docker сервис не видит вообще
|
||
# (доступ только к socket-proxy по сети compose), но принцип наименьших
|
||
# привилегий соблюдаем и здесь.
|
||
RUN useradd --no-create-home --shell /usr/sbin/nologin exporter
|
||
USER exporter
|
||
|
||
EXPOSE 9419
|
||
|
||
HEALTHCHECK --interval=10s --timeout=5s --retries=10 --start-period=15s \
|
||
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:9419/health')" || exit 1
|
||
|
||
# Не `uv run` — тому нужен писабельный кэш в $HOME, а у непривилегированного
|
||
# пользователя без домашней директории (--no-create-home выше) его нет;
|
||
# зависимости уже установлены в .venv на шаге сборки, `uv run` в рантайме
|
||
# не добавляет ничего, кроме этой проблемы.
|
||
CMD [".venv/bin/python", "exporter.py"]
|