From c0af4fd712fa24a51188ac1f24eed040426f570e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=BB=20=D0=9E=D0=BC=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D1=87=D0=BA=D0=BE?= Date: Tue, 22 Sep 2026 21:17:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=B9=D0=BD=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20Docker=20=D0=B8=20?= =?UTF-8?q?docker-compose=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=D0=B0=20=D0=B8=20=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dockerfile на python:3.11-slim с libgomp1, непривилегированным пользователем и healthcheck; - docker-entrypoint.sh с поддержкой шорткатов test/benchmark/evaluate/pipeline; - docker-compose.yml с профилями тестирования, оценки и бенчмарка; - docs/DOCKER.md: руководство по сборке, запуску и монтированию томов. --- .dockerignore | 38 ++++++++++++++++++ Dockerfile | 50 ++++++++++++++++++++++++ docker-compose.yml | 91 ++++++++++++++++++++++++++++++++++++++++++++ docker-entrypoint.sh | 50 ++++++++++++++++++++++++ docs/DOCKER.md | 81 +++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 6 files changed, 311 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100755 docker-entrypoint.sh create mode 100644 docs/DOCKER.md diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..7175273 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,38 @@ +# Git +.git +.gitignore +.gitattributes +.github + +# Python caches +__pycache__ +*.pyc +*.pyo +*.pyd +.pytest_cache +.coverage +htmlcov/ +*.egg-info/ +dist/ +build/ + +# Virtual environments +venv/ +.venv/ +env/ +.env + +# Editor & OS artifacts +.idea/ +.vscode/ +*.swp +*.swo +*~ +.DS_Store + +# Agent & temporary files +scratch/ +.gemini/ + +# Raw lidar data (mounted via volume, never baked into image) +data/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bee8303 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,50 @@ +# ============================================================================ +# FlyGuard: ML-ядро обнаружения препятствий в тоннеле метро (Кейс 05, ЛЦТ-2026) +# ============================================================================ +FROM python:3.11-slim-bookworm AS base + +# System configuration & environment +ENV DEBIAN_FRONTEND=noninteractive \ + PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONPATH="/app:/app/tools" \ + FLYGUARD_DATA="/data" + +# Install runtime system dependencies (libgomp1 is required by LightGBM/OpenMP) +RUN apt-get update && apt-get install -y --no-install-recommends \ + libgomp1 \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Create non-root user and directories +RUN useradd -m -u 1000 -s /bin/bash flyguard && \ + mkdir -p /app /data /app/artifacts && \ + chown -R flyguard:flyguard /app /data + +WORKDIR /app + +# Cache layer: copy only requirements first +COPY --chown=flyguard:flyguard requirements.txt /app/ + +# Install python dependencies +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt + +# Copy application source code +COPY --chown=flyguard:flyguard . /app/ + +# Make sure entrypoint script is executable +RUN chmod +x /app/docker-entrypoint.sh + +# Switch to non-root user for security +USER flyguard + +# Volume mount points +VOLUME ["/data", "/app/artifacts"] + +# Container healthcheck +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD python3 -c "import flyguard, numpy, scipy, lightgbm; print('healthy')" || exit 1 + +ENTRYPOINT ["/app/docker-entrypoint.sh"] +CMD ["test"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5cbcec5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,91 @@ +services: + # -------------------------------------------------------------------------- + # 1. Запуск набора тестов + # docker compose run --rm test + # -------------------------------------------------------------------------- + test: + build: + context: . + dockerfile: Dockerfile + image: flyguard:latest + container_name: flyguard-test + command: ["test"] + volumes: + - ./artifacts:/app/artifacts + - ./data:/data:ro + environment: + - PYTHONUNBUFFERED=1 + - FLYGUARD_DATA=/data + shm_size: '2gb' + + # -------------------------------------------------------------------------- + # 2. Оценка ложных тревог (leave-one-bag-out) + # docker compose run --rm evaluate + # -------------------------------------------------------------------------- + evaluate: + image: flyguard:latest + container_name: flyguard-evaluate + command: ["evaluate", "--mbon-dir", "artifacts/mbon_folds"] + volumes: + - ./artifacts:/app/artifacts + - ./data:/data:ro + environment: + - PYTHONUNBUFFERED=1 + - FLYGUARD_DATA=/data + shm_size: '2gb' + + # -------------------------------------------------------------------------- + # 3. Полигон дальности обнаружения с аугментациями + # docker compose run --rm benchmark + # -------------------------------------------------------------------------- + benchmark: + image: flyguard:latest + container_name: flyguard-benchmark + command: [ + "benchmark", + "--memory", "artifacts/mushroom_body.npz", + "--mbon-dir", "artifacts/mbon_folds", + "--augment", + "--out", "artifacts/benchmark.json" + ] + volumes: + - ./artifacts:/app/artifacts + - ./data:/data:ro + environment: + - PYTHONUNBUFFERED=1 + - FLYGUARD_DATA=/data + shm_size: '2gb' + + # -------------------------------------------------------------------------- + # 4. Прогон конвейера по бэгу + # docker compose run --rm pipeline --bag /data/for_hackathon/doubleT_obstacle --verbose + # -------------------------------------------------------------------------- + pipeline: + image: flyguard:latest + container_name: flyguard-pipeline + command: ["pipeline", "--all", "--memory", "artifacts/mushroom_body.npz"] + volumes: + - ./artifacts:/app/artifacts + - ./data:/data:ro + environment: + - PYTHONUNBUFFERED=1 + - FLYGUARD_DATA=/data + shm_size: '2gb' + + # -------------------------------------------------------------------------- + # 5. Интерактивная оболочка + # docker compose run --rm shell + # -------------------------------------------------------------------------- + shell: + image: flyguard:latest + container_name: flyguard-shell + command: ["bash"] + volumes: + - ./artifacts:/app/artifacts + - ./data:/data:ro + environment: + - PYTHONUNBUFFERED=1 + - FLYGUARD_DATA=/data + stdin_open: true + tty: true + shm_size: '2gb' diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 0000000..456e6c5 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +set -e + +# Default to run_tests if no arguments provided +if [ $# -eq 0 ]; then + echo "==> FlyGuard container started without arguments. Running verification tests..." + exec python3 tests/run_tests.py +fi + +# Subcommand shortcuts +case "$1" in + test|tests|run-tests) + shift + exec python3 tests/run_tests.py "$@" + ;; + pytest) + shift + exec pytest tests "$@" + ;; + pipeline|run-pipeline) + shift + exec python3 tools/run_pipeline.py "$@" + ;; + benchmark|make-benchmark) + shift + exec python3 tools/make_benchmark.py "$@" + ;; + evaluate) + shift + exec python3 tools/evaluate.py "$@" + ;; + train-mbon) + shift + exec python3 tools/train_mbon.py "$@" + ;; + train-track) + shift + exec python3 tools/train_track.py "$@" + ;; + plot|plot-benchmark) + shift + exec python3 tools/plot_benchmark.py "$@" + ;; + bash|sh) + exec /bin/bash "$@" + ;; + *) + exec "$@" + ;; +esac diff --git a/docs/DOCKER.md b/docs/DOCKER.md new file mode 100644 index 0000000..ae96d6d --- /dev/null +++ b/docs/DOCKER.md @@ -0,0 +1,81 @@ +# Руководство по запуску FlyGuard в Docker + +## 1. Быстрая сборка образа + +Сборка легковесного образа на базе `python:3.11-slim-bookworm` (включает OpenMP/BLAS и зависимости): + +```bash +docker build -t flyguard:latest . +``` + +--- + +## 2. Запуск тестов + +Контейнер по умолчанию выполняет самодиагностику и тестовый набор: + +```bash +# Прямой запуск через Docker +docker run --rm flyguard:latest + +# Либо через docker compose +docker compose run --rm test +``` + +--- + +## 3. Запуск конвейера и бенчмарка с данными лидара + +Датасеты монтируются в контейнер в каталог `/data`: + +```bash +# Оценка ложных тревог по всем бэгам +docker run --rm \ + -v /path/to/lidar/data:/data:ro \ + -v $(pwd)/artifacts:/app/artifacts \ + --shm-size=2g \ + flyguard:latest evaluate --mbon-dir artifacts/mbon_folds + +# Запуск полигона дальности с новыми аугментациями +docker run --rm \ + -v /path/to/lidar/data:/data:ro \ + -v $(pwd)/artifacts:/app/artifacts \ + --shm-size=2g \ + flyguard:latest benchmark --memory artifacts/mushroom_body.npz --augment + +# Прогон по конкретному бэгу с выводом телеметрии в реальном времени +docker run --rm \ + -v /path/to/lidar/data:/data:ro \ + flyguard:latest pipeline --bag /data/for_hackathon/doubleT_obstacle --verbose +``` + +--- + +## 4. Интерактивная отладка + +Войти внутрь контейнера с настроенным окружением: + +```bash +docker compose run --rm shell +# или +docker run -it --rm \ + -v /path/to/lidar/data:/data:ro \ + -v $(pwd)/artifacts:/app/artifacts \ + flyguard:latest bash +``` + +--- + +## 5. Доступные команды шорткатов entrypoint + +Точка входа `docker-entrypoint.sh` поддерживает удобные псевдонимы: + +* `test` — запускает автономный набор юнит-тестов (`tests/run_tests.py`) +* `pytest` — запускает `pytest tests` +* `pipeline` — вызывает `tools/run_pipeline.py` +* `benchmark` — вызывает `tools/make_benchmark.py` +* `evaluate` — вызывает `tools/evaluate.py` +* `train-mbon` — вызывает `tools/train_mbon.py` +* `train-track` — вызывает `tools/train_track.py` +* `plot` — вызывает `tools/plot_benchmark.py` +* `bash` / `sh` — открывает командную оболочку diff --git a/requirements.txt b/requirements.txt index 803f00f..6c5868e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ numpy>=1.24 scipy>=1.10 # только для контрольного бустинга в tools/train_mbon.py --baseline lightgbm>=4.0 +matplotlib>=3.7 # только для обучения на GPU (tools/train_mbon.py --device cuda); ядру не нужен # torch>=2.0 pytest>=7.0