# 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 ./requirements /app/requirements COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv RUN uv pip install --system --requirement requirements/base.txt # stage 2 FROM node:lts AS frontend-build WORKDIR /app COPY ./*.json ./*.js ./babel.config.json /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 /usr/local/lib/python3.11 /usr/local/lib/python3.11 COPY --from=backend /usr/local/bin/celery /usr/local/bin/celery 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 COPY ./requirements /app/requirements COPY --from=backend /bin/uv /bin/uv RUN uv pip install --system --requirement requirements/production.txt RUN useradd -M -u 1000 newsreader RUN chown -R 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 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 ./requirements /app/requirements COPY ./bin/docker-entrypoint.sh /app/bin/docker-entrypoint.sh COPY --from=backend /usr/local/lib/python3.11 /usr/local/lib/python3.11 COPY --from=backend /usr/local/bin/celery /usr/local/bin/celery COPY --from=backend /app/src/ /app/src/ COPY --from=backend /bin/uv /bin/uv RUN uv pip install --system --requirement requirements/development.txt RUN useradd -M -u 1000 newsreader RUN chown -R newsreader:newsreader /app USER newsreader