From 2f279d2816a8b7c65be48c4b730954eea9e24a8c Mon Sep 17 00:00:00 2001 From: denis Date: Wed, 23 Sep 2026 23:53:26 +0300 Subject: [PATCH] develop - hack_2026 --- Dockerfile | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index a1f35d7..c3daaa5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,16 @@ # DXA Quality Assessment — контейнер для инференса (CPU) # -# Сборка: docker build -t dxa-quality . -# Запуск: docker run -v /path/to/data:/data -p 8000:8000 dxa-quality +# Сборка: docker build -t rell.ru:5000/rell-bone-2026:latest . +# Запуск: docker run -v /data/bone_2026/models:/app/models:ro -p 8000:8000 dxa-quality # -# Требования методики: зависимости с зафиксированными версиями и запуск -# локально без обращения к внешним сервисам. Inference не использует -# предобученные веса из интернета — они уже внутри чекпоинта, поэтому -# при запуске сеть не нужна. +# Веса в образ НЕ копируются: swarm монтирует каталог с чекпоинтом в +# /app/models только для чтения, а models/ не попадает в git (см. .gitignore), +# поэтому COPY models ломал бы сборку в CI. Путь к чекпоинту берётся из +# DXA_MODEL_PATH и по умолчанию указывает на смонтированный каталог. +# +# Требования методики: зафиксированные версии зависимостей и работа без +# внешних сервисов. Inference не скачивает веса из сети — они внутри +# чекпоинта, поэтому при запуске сеть не нужна. FROM python:3.11-slim # libgl1/libglib2.0-0 нужны opencv (импортируется через зависимости проекта), @@ -30,24 +34,19 @@ RUN pip install --no-cache-dir --upgrade pip \ # --- Код --- COPY src ./src -COPY models ./models # Скрипт пакетной обработки (оценка берёт его из корня образа). COPY run.sh ./run.sh RUN chmod +x ./run.sh -# smoke-проверка: чекпоинт должен читаться. Падает на сборке, если модели нет, -# вместо тихого 500 на каждом запросе в рантайме. -RUN python -c "import os, torch; p='models/dxa_model.pth'; \ - assert os.path.exists(p), f'missing checkpoint {p}'; \ - ck=torch.load(p, map_location='cpu', weights_only=False); \ - assert 'model_state_dict' in ck, 'checkpoint has no model_state_dict'; \ - print('checkpoint ok:', ck.get('backbone'), ck.get('head'))" +# Smoke-проверка импорта: падает на сборке, если расходятся зависимости или +# модуль не найден, вместо тихой 500-й на каждом запросе в рантайме. Модель +# здесь не загружается — чекпоинта в контексте сборки нет. +RUN python -c "import src.main; print('app import ok')" -# --- Сборка статики для офлайн-работы --- +# --- Проверка статики для офлайн-работы --- # Веб-интерфейс не должен зависеть от CDN: Tailwind и FontAwesome лежат в -# src/api/static/vendor и src/api/static/webfonts (см. index.html). Сборка -# проверяет их наличие, чтобы образ не остался без оформления. +# src/api/static/vendor и src/api/static/webfonts (см. index.html). RUN python -c "import os; \ files=['src/api/static/vendor/tailwind.js','src/api/static/vendor/fontawesome.css', \ 'src/api/static/webfonts/fa-solid-900.woff2']; \ @@ -55,9 +54,20 @@ RUN python -c "import os; \ assert not missing, f'missing frontend assets: {missing}'; \ print('frontend assets ok')" +# Каталоги монтирований swarm: создаём заранее, чтобы образ вёл себя одинаково +# и при обычном `docker run` без volume. +RUN mkdir -p /app/data /app/logs + +# --- Переменные окружения --- +# Читается кодом только DXA_MODEL_PATH (src/main.py). MODEL_PATH, DATA_PATH, +# ANNOTATION_DIR, APP_* swarm передаёт по инерции от прежней версии — код их +# не использует, и они ни на что не влияют. ENV PYTHONUNBUFFERED=1 \ PYTHONPATH=/app \ - DXA_MODEL_PATH=/app/models/dxa_model.pth + DXA_MODEL_PATH=/app/models/dxa_model.pth \ + MODEL_PATH=/app/models \ + DATA_PATH=/app/data \ + ANNOTATION_DIR=/app/data/annotations EXPOSE 8000