Files
avaaz/app/backend/Dockerfile
Madava d6b61ae8fb
All checks were successful
Continuous Integration / Validate and test changes (push) Successful in 3s
Add app scaffold and workflows
2025-12-03 08:58:34 +01:00

85 lines
2.7 KiB
Docker

#
# BACKEND DOCKERFILE
#
# Multi-stage image for the FastAPI + LiveKit Agent backend using uv.
# - production: smallest runtime image with gunicorn/uvicorn worker
# - development: hot-reload friendly image with full toolchain
# - builder: installs dependencies once for reuse across stages
#
# Keep dependency definitions aligned with docs/architecture.md.
FROM python:3.12-slim AS base
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
UV_PROJECT_ENVIRONMENT=/app/.venv \
UV_LINK_MODE=copy
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
curl \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
RUN groupadd --system app && useradd --system --home /app --gid app app
WORKDIR /app
# Install uv globally so subsequent stages share the toolchain.
RUN pip install --upgrade pip uv
# ------------------------------------------------------------------------------
# Builder: install prod dependencies into an in-project virtualenv
# ------------------------------------------------------------------------------
FROM base AS builder
COPY . .
RUN test -f pyproject.toml || (echo "pyproject.toml is required for uv sync"; exit 1)
RUN if [ -f uv.lock ]; then \
uv sync --frozen --no-dev --compile-bytecode; \
else \
uv sync --no-dev --compile-bytecode; \
fi
# ------------------------------------------------------------------------------
# Production: minimal runtime image with gunicorn as the entrypoint
# ------------------------------------------------------------------------------
FROM python:3.12-slim AS production
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1
RUN apt-get update \
&& apt-get install -y --no-install-recommends libpq5 \
&& rm -rf /var/lib/apt/lists/*
RUN groupadd --system app && useradd --system --home /app --gid app app
WORKDIR /app
COPY --from=builder --chown=app:app /app /app
ENV PATH="/app/.venv/bin:$PATH"
USER app
EXPOSE 8000
CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "main:app", "--bind", "0.0.0.0:8000"]
# ------------------------------------------------------------------------------
# Development: includes dev dependencies and keeps uvicorn reload-friendly
# ------------------------------------------------------------------------------
FROM base AS development
COPY . .
RUN test -f pyproject.toml || (echo "pyproject.toml is required for uv sync"; exit 1)
RUN if [ -f uv.lock ]; then \
uv sync --frozen --dev --compile-bytecode; \
else \
uv sync --dev --compile-bytecode; \
fi
ENV PATH="/app/.venv/bin:$PATH"
USER app
EXPOSE 8000