forked from Dan4ick/Lidar_Muxa
контейнеризация Docker и docker-compose для запуска и тестов
- Dockerfile на python:3.11-slim с libgomp1, непривилегированным пользователем и healthcheck; - docker-entrypoint.sh с поддержкой шорткатов test/benchmark/evaluate/pipeline; - docker-compose.yml с профилями тестирования, оценки и бенчмарка; - docs/DOCKER.md: руководство по сборке, запуску и монтированию томов; - requirements.txt: добавлен matplotlib для построения графиков.
This commit is contained in:
parent
062bdfd68c
commit
a06a2f45bb
6 changed files with 311 additions and 0 deletions
38
.dockerignore
Normal file
38
.dockerignore
Normal file
|
|
@ -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/
|
||||
50
Dockerfile
Normal file
50
Dockerfile
Normal file
|
|
@ -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"]
|
||||
91
docker-compose.yml
Normal file
91
docker-compose.yml
Normal file
|
|
@ -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'
|
||||
50
docker-entrypoint.sh
Executable file
50
docker-entrypoint.sh
Executable file
|
|
@ -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
|
||||
81
docs/DOCKER.md
Normal file
81
docs/DOCKER.md
Normal file
|
|
@ -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` — открывает командную оболочку
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue