# Многоступенчатая сборка для оптимизации размера образа # Этап 1: Сборка зависимостей FROM python:3.12-slim AS builder WORKDIR /app # Устанавливаем uv - современный менеджер пакетов для Python RUN pip install --no-cache-dir uv # Копируем файлы зависимостей и конфигурации uv COPY pyproject.toml ./ COPY uv.lock ./ # Создаем виртуальное окружение и синхронизируем зависимости RUN uv venv /app/.venv RUN uv sync --frozen # Этап 2: Производственный образ FROM python:3.12-slim AS production # Устанавливаем curl для healthcheck RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* WORKDIR /app # Копируем виртуальное окружение с установленными пакетами COPY --from=builder /app/.venv /app/.venv # Копируем исходный код приложения COPY app.api/ ./app.api/ COPY app.bot/ ./app.bot/ COPY app.control-bot/ ./app.control-bot/ COPY *.py ./ COPY pyproject.toml ./ # Создаем папку для изображений RUN mkdir -p ./images # Создаем непривилегированного пользователя для безопасности RUN groupadd -r appuser && useradd -r -g appuser -s /bin/bash appuser RUN chown -R appuser:appuser /app USER appuser # Открываем порт для API EXPOSE 8000 # Устанавливаем переменные окружения ENV PYTHONPATH=/app ENV PYTHONUNBUFFERED=1 ENV VIRTUAL_ENV=/app/.venv ENV PATH="/app/.venv/bin:$PATH" # Проверка здоровья контейнера HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \ CMD python -c "import requests; requests.get('http://localhost:8000/docs')" || exit 1 # Команда по умолчанию для запуска бота (можно переопределить в docker-compose) CMD ["python", "main.py", "--mode", "bot"]