develop - hack_2026
This commit is contained in:
parent
8d93298877
commit
2f279d2816
46
Dockerfile
46
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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue