# stage 1 FROM python:3.11-bookworm AS backend RUN apt-get update && apt-get install --yes --no-install-recommends \ vim \ curl \ gettext \ && rm -rf /var/lib/apt/lists/* WORKDIR /app RUN mkdir /app/src RUN mkdir /app/logs RUN mkdir /app/media COPY uv.lock pyproject.toml /app/ COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv RUN uv sync --frozen --no-default-groups --no-install-project # stage 2 FROM node:lts AS frontend-build WORKDIR /app COPY ./*.json ./*.js ./babel.config.js /app/ RUN npm ci COPY ./src /app/src RUN npm run build:prod # stage 3 FROM python:3.11-bookworm AS production RUN apt-get update && apt-get install --yes --no-install-recommends \ postgresql-client \ vim \ curl \ gettext \ && rm -rf /var/lib/apt/lists/* WORKDIR /app RUN mkdir /app/logs RUN mkdir /app/media RUN mkdir /app/bin COPY --from=backend /app/.venv /app/.venv COPY --from=backend /app/uv.lock /app/pyproject.toml /app/ COPY --from=backend /bin/uv /bin/uv COPY ./bin/docker-entrypoint.sh /app/bin/docker-entrypoint.sh COPY --from=frontend-build /app/src/newsreader/static /app/src/newsreader/static COPY ./src /app/src RUN uv sync --frozen --only-group production --extra sentry RUN useradd --no-create-home --uid 1000 newsreader RUN chown --recursive newsreader:newsreader /app USER newsreader ARG POSTGRES_HOST ARG POSTGRES_PORT ARG POSTGRES_DB ARG POSTGRES_USER ARG POSTGRES_PASSWORD ARG DJANGO_SECRET_KEY ARG DJANGO_SETTINGS_MODULE # Note that the static volume will have to be recreated to be pre-populated # correctly with the latest static files. See # https://docs.docker.com/storage/volumes/#populate-a-volume-using-a-container RUN /app/.venv/bin/python src/manage.py collectstatic --noinput # (optional) stage 4 FROM python:3.11-bookworm AS development RUN apt-get update && apt-get install --yes --no-install-recommends \ vim \ curl \ && rm -rf /var/lib/apt/lists/* WORKDIR /app RUN mkdir /app/logs RUN mkdir /app/media RUN mkdir /app/bin COPY --from=backend /app/.venv /app/.venv COPY --from=backend /app/uv.lock /app/pyproject.toml /app/ COPY ./bin/docker-entrypoint.sh /app/bin/docker-entrypoint.sh COPY --from=backend /app/src/ /app/src/ COPY --from=backend /bin/uv /bin/uv RUN uv sync --frozen --group development