# syntax=docker/dockerfile:1 FROM python:3.13-slim-trixie AS base COPY --from=ghcr.io/astral-sh/uv:0.13.6 /uv /usr/local/bin/uv ENV PYTHONUNBUFFERED=1 \ UV_COMPILE_BYTECODE=1 \ UV_LINK_MODE=copy \ UV_PYTHON_DOWNLOADS=never \ # Outside /app so the compose bind mount doesn't hide it. UV_PROJECT_ENVIRONMENT=/opt/venv \ PATH="/opt/venv/bin:$PATH" WORKDIR /app FROM base AS dev RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ uv sync --locked --no-install-project ENV DJANGO_SETTINGS_MODULE=config.settings.dev CMD ["sh", "-c", "python manage.py migrate --noinput && python manage.py runserver 0.0.0.0:8000"] FROM base AS prod COPY --from=litestream/litestream:0.5.17 /usr/local/bin/litestream /usr/local/bin/litestream RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ uv sync --locked --no-install-project --no-dev COPY litestream.yml /etc/litestream.yml COPY . . RUN DJANGO_SETTINGS_MODULE=config.settings.prod DJANGO_SECRET_KEY=collectstatic \ python manage.py collectstatic --noinput ENV DJANGO_SETTINGS_MODULE=config.settings.prod EXPOSE 8000 CMD ["bin/start"]