# Многоступенчатая сборка для оптимизации размера образа # Этап 1: Сборка зависимостей FROM python:3.12-slim AS builder WORKDIR /app # Устанавливаем системные зависимости для сборки RUN apt-get update && apt-get install -y \ gcc \ build-essential \ libpq-dev \ && rm -rf /var/lib/apt/lists/* # Устанавливаем uv для управления зависимостями RUN pip install uv # Копируем файлы зависимостей COPY pyproject.toml uv.lock* ./ # Устанавливаем зависимости RUN uv sync --frozen # Этап 2: Производственный образ FROM python:3.12-slim AS production WORKDIR /app # Устанавливаем только необходимые runtime зависимости RUN apt-get update && apt-get install -y \ libpq5 \ postgresql-client \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean # Копируем установленные зависимости из builder stage COPY --from=builder /app/.venv /app/.venv # Копируем исходный код приложения (единое приложение с API и database) COPY api/ ./api/ COPY database/ ./database/ COPY run_api.py ./ COPY pyproject.toml ./ # Создаем непривилегированного пользователя для безопасности 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 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/health')" || exit 1 # Команда для запуска единого приложения (API + database логика) CMD ["python", "run_api.py"]