Skip to content

Dockerfile for Django

Dockerfile
FROM python:3.12-alpine AS base

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ARG GIT_ACCESS_TOKEN

FROM base AS build-oldap

RUN apk update \
  && apk add --no-cache openldap-dev \
  && apk add --no-cache gcc \
  && apk add --no-cache musl-dev \
  && apk add --no-cache libc6-compat \
  && python -m pip wheel --wheel-dir=/tmp python-ldap

FROM base AS build-psycopg2

RUN apk update \
  && apk add --no-cache postgresql-dev \
  && apk add --no-cache gcc \
  && apk add --no-cache musl-dev \
  && python -m pip wheel --wheel-dir=/tmp psycopg2

FROM base AS prod

# oldap built wheel
COPY --from=build-oldap /tmp/*.whl /tmp

# oldap dependencies from previous stage
COPY --from=build-oldap /usr/lib/libldap.so.2 /usr/lib/libldap.so.2
COPY --from=build-oldap /usr/lib/liblber.so.2 /usr/lib/liblber.so.2
COPY --from=build-oldap /usr/lib/libsasl2.so.3 /usr/lib/libsasl2.so.3

# psycopg2 built wheel
COPY --from=build-psycopg2 /tmp/*.whl /tmp

# Install our builded wheels
RUN python -m pip install /tmp/*.whl

RUN apk update \
  && apk add --no-cache postgresql-dev \
  && python -m pip install --upgrade pip --no-cache-dir

RUN apk add --no-cache git
RUN git config --global url."https://${GIT_ACCESS_TOKEN}@github.com".insteadOf "https://github.com"

EXPOSE 8000

WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN set -ex && python -m pip install --no-cache-dir -r requirements.txt
COPY . /app

CMD ["daphne", "-b", "0.0.0.0", "-p", "8000", "config.asgi:application"]

FROM prod AS dev
COPY requirements-tests.txt /app/requirements-tests.txt
RUN set -ex \
    && python -m pip install --no-cache-dir -r requirements-tests.txt \
    && python -m pip install --no-cache-dir watchdog[watchmedo]