{% if cookiecutter.frontend_pipeline in ['Gulp', 'Webpack'] -%} FROM docker.io/node:20-bookworm-slim AS client-builder ARG APP_HOME=/app WORKDIR ${APP_HOME} COPY ./package.json ${APP_HOME} RUN npm install && npm cache clean --force ADD . ${APP_HOME} {%- if cookiecutter.frontend_pipeline == 'Webpack' and cookiecutter.use_whitenoise == 'n' %} {%- if cookiecutter.cloud_provider == 'AWS' %} ARG DJANGO_AWS_STORAGE_BUCKET_NAME ENV DJANGO_AWS_STORAGE_BUCKET_NAME=${DJANGO_AWS_STORAGE_BUCKET_NAME} ARG DJANGO_AWS_S3_CUSTOM_DOMAIN ENV DJANGO_AWS_S3_CUSTOM_DOMAIN=${DJANGO_AWS_S3_CUSTOM_DOMAIN} {%- elif cookiecutter.cloud_provider == 'GCP' %} ARG DJANGO_GCP_STORAGE_BUCKET_NAME ENV DJANGO_GCP_STORAGE_BUCKET_NAME=${DJANGO_GCP_STORAGE_BUCKET_NAME} {%- elif cookiecutter.cloud_provider == 'Azure' %} ARG DJANGO_AZURE_ACCOUNT_NAME ENV DJANGO_AZURE_ACCOUNT_NAME=${DJANGO_AZURE_ACCOUNT_NAME} {%- endif %} {%- endif %} RUN npm run build {%- endif %} FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS python-build-stage ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy # Install apt packages RUN apt-get update && apt-get install --no-install-recommends -y \ # dependencies for building Python packages build-essential \ # psycopg dependencies libpq-dev # Requirements are installed here to ensure they will be cached. 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 --frozen --no-install-project --no-dev {%- if cookiecutter.frontend_pipeline in ['Gulp', 'Webpack'] %} COPY --from=client-builder ${APP_HOME} ${APP_HOME} {% else %} ADD . ${APP_HOME} {%- endif %} RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --frozen --no-dev # Python 'run' stage FROM docker.io/python:3.12.7-slim-bookworm AS python-run-stage ARG APP_HOME=/app WORKDIR ${APP_HOME} RUN addgroup --system django \ && adduser --system --ingroup django django # Install required system dependencies RUN apt-get update && apt-get install --no-install-recommends -y \ # psycopg dependencies libpq-dev \ # Translations dependencies gettext \ # entrypoint wait-for-it \ # cleaning up unused files && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ && rm -rf /var/lib/apt/lists/* COPY --chown=django:django ./compose/production/django/entrypoint /entrypoint RUN sed -i 's/\r$//g' /entrypoint RUN chmod +x /entrypoint COPY --chown=django:django ./compose/production/django/start /start RUN sed -i 's/\r$//g' /start RUN chmod +x /start {%- if cookiecutter.use_celery == "y" %} COPY --chown=django:django ./compose/production/django/celery/worker/start /start-celeryworker RUN sed -i 's/\r$//g' /start-celeryworker RUN chmod +x /start-celeryworker COPY --chown=django:django ./compose/production/django/celery/beat/start /start-celerybeat RUN sed -i 's/\r$//g' /start-celerybeat RUN chmod +x /start-celerybeat COPY --chown=django:django ./compose/production/django/celery/flower/start /start-flower RUN sed -i 's/\r$//g' /start-flower RUN chmod +x /start-flower {%- endif %} # Copy the application from the builder COPY --from=python-build-stage --chown=django:django ${APP_HOME} ${APP_HOME} # Place executables in the environment at the front of the path ENV PATH="/app/.venv/bin:$PATH" USER django RUN DATABASE_URL="" \ DJANGO_SETTINGS_MODULE="config.settings.test" \ python manage.py compilemessages ENTRYPOINT ["/entrypoint"]