File size: 2,388 Bytes
67ad8b2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# syntax = docker/dockerfile:1.9-labs    # ← обязательно для --mount=type=cache,link

# ────────────────────────────────────────────────
# Стадия 1 — сборка зависимостей (builder)
# ────────────────────────────────────────────────
FROM python:3.13-slim AS builder

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=off \
    UV_COMPILE_BYTECODE=1 \
    UV_LINK_MODE=copy \
    HF_HOME=/app/hf_cache

WORKDIR /app

# Копируем только lock-файлы / requirements (самое важное!)
COPY pyproject.toml uv.lock requirements.txt* ./

# Устанавливаем uv (самый быстрый installer в 2026)
RUN --mount=type=cache,target=/root/.cache/uv \
    pip install --no-cache-dir uv && \
    uv sync --frozen --no-install-project --no-dev

ENV PATH="/app/.venv/bin:$PATH"

# ------------------- ЗАГРУЗКА МОДЕЛИ -------------------
# Теперь, когда зависимости установлены, скачиваем модель эмбеддингов
# (эта команда сохранит файлы в $HF_HOME)
RUN python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('deepvk/USER-bge-m3')"
# -------------------------------------------------------

# ────────────────────────────────────────────────
# Стадия 2 — финальный образ (runtime)
# ────────────────────────────────────────────────
FROM python:3.13-slim

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    HF_HOME=/app/hf_cache

WORKDIR /app

# Копируем виртуальное окружение из builder
COPY --from=builder /app/.venv /app/.venv

# Копируем папку с загруженной моделью
COPY --from=builder /app/hf_cache /app/hf_cache

# Добавляем venv в PATH
ENV PATH="/app/.venv/bin:$PATH"

# Копируем весь код (самое последнее!)
COPY . .

CMD ["python", "main.py"]