59 lines
2.1 KiB
Docker
59 lines
2.1 KiB
Docker
# Многоступенчатая сборка для оптимизации размера образа
|
||
|
||
# Этап 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"] |