65 lines
2.2 KiB
Docker
65 lines
2.2 KiB
Docker
# Multi-stage Docker build для оптимального размера
|
||
FROM python:3.11-slim as base
|
||
|
||
# Установка системных зависимостей
|
||
RUN apt-get update && apt-get install -y \
|
||
gcc \
|
||
postgresql-client \
|
||
curl \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# Создание пользователя приложения
|
||
RUN useradd --create-home --shell /bin/bash app
|
||
|
||
# Установка рабочей директории
|
||
WORKDIR /app
|
||
|
||
# Копирование и установка Python зависимостей
|
||
COPY requirements.txt .
|
||
RUN pip install --no-cache-dir --upgrade pip && \
|
||
pip install --no-cache-dir -r requirements.txt
|
||
|
||
# Production stage
|
||
FROM base as production
|
||
|
||
# Build arguments для метаданных
|
||
ARG BUILD_VERSION=latest
|
||
ARG BUILD_DATE
|
||
ARG VCS_REF
|
||
|
||
# Метаданные образа
|
||
LABEL org.opencontainers.image.title="CatLink Backend" \
|
||
org.opencontainers.image.description="Django REST API для CatLink" \
|
||
org.opencontainers.image.version="$BUILD_VERSION" \
|
||
org.opencontainers.image.created="$BUILD_DATE" \
|
||
org.opencontainers.image.revision="$VCS_REF" \
|
||
org.opencontainers.image.source="https://github.com/smartsoltech/links"
|
||
|
||
# Копирование приложения
|
||
COPY --chown=app:app . .
|
||
|
||
# Создание необходимых директорий
|
||
RUN mkdir -p staticfiles media logs && \
|
||
chown -R app:app /app
|
||
|
||
# Переключение на пользователя приложения
|
||
USER app
|
||
|
||
# Сбор статических файлов
|
||
RUN python manage.py collectstatic --noinput
|
||
|
||
# Переменные окружения для продакшена
|
||
ENV PYTHONPATH="/app" \
|
||
PYTHONUNBUFFERED=1 \
|
||
DJANGO_SETTINGS_MODULE="backend.settings" \
|
||
PORT=8000
|
||
|
||
# Health check
|
||
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
|
||
CMD curl -f http://localhost:$PORT/api/health/ || exit 1
|
||
|
||
# Открытие порта
|
||
EXPOSE $PORT
|
||
|
||
# Команда запуска
|
||
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "--worker-class", "sync", "--worker-connections", "1000", "--max-requests", "1000", "--max-requests-jitter", "100", "backend.wsgi:application"] |