FROM python:3.14-slim-trixie AS build COPY --from=ghcr.io/astral-sh/uv:0.13.6 /uv /bin/uv # mysqlclient ships no wheels RUN apt-get update \ && apt-get install -y --no-install-recommends build-essential pkg-config default-libmysqlclient-dev \ && rm -rf /var/lib/apt/lists/* # Outside /app, so a code change leaves the venv layer alone ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=never UV_PROJECT_ENVIRONMENT=/venv WORKDIR /app COPY pyproject.toml uv.lock ./ RUN uv sync --locked --no-dev --group prod --no-install-project COPY . . RUN DJANGO_SETTINGS_MODULE=dpdapisite.settings_prod SECRET_KEY=collectstatic DB_PASSWORD=collectstatic \ /venv/bin/python manage.py collectstatic --noinput FROM python:3.14-slim-trixie RUN apt-get update \ && apt-get install -y --no-install-recommends libmariadb3 \ && rm -rf /var/lib/apt/lists/* \ && useradd --system --uid 934 --home-dir /app --no-create-home mxapi COPY --from=build /venv /venv COPY --from=build /app /app WORKDIR /app ARG SENTRY_RELEASE=N/A ENV PATH=/venv/bin:$PATH \ DJANGO_SETTINGS_MODULE=dpdapisite.settings_prod \ PYTHONUNBUFFERED=1 \ SENTRY_RELEASE=$SENTRY_RELEASE USER mxapi EXPOSE 8000 CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "2", "--no-control-socket", "--access-logfile", "-", "dpdapisite.wsgi"]