FROM alpine:3.16 as pre-build

# We need this additional step to avoid having poetrys deps interacting with our
# dependencies. This is only required until alpine 3.16 is released, since this
# allows us to install poetry as package.

RUN apk add --no-cache python3 py3-cryptography py3-pip poetry
COPY pyproject.toml poetry.lock /
RUN poetry export --without-hashes > requirements.txt
RUN poetry export --dev --without-hashes > dev-requirements.txt

FROM alpine:3.16 as builder

RUN \
    echo 'installing dependencies' && \
    apk add --no-cache \
    git \
    musl-dev \
    gcc \
    postgresql-dev \
    python3-dev \
    py3-psycopg2 \
    py3-cryptography \
    libldap \
    libffi-dev \
    make \
    zlib-dev \
    jpeg-dev \
    openldap-dev \
    openssl-dev \
    cargo \
    libxml2-dev \
    libxslt-dev \
    curl \
    && \
    ln -s /usr/bin/python3 /usr/bin/python

# create virtual env for next stage
RUN python -m venv --system-site-packages /venv
# emulate activation by prefixing PATH
ENV PATH="/venv/bin:/root/.local/bin:$PATH" VIRTUAL_ENV=/venv

COPY --from=pre-build /requirements.txt /requirements.txt
COPY --from=pre-build /dev-requirements.txt /dev-requirements.txt
# hack around https://github.com/pypa/pip/issues/6158#issuecomment-456619072
ENV PIP_DOWNLOAD_CACHE=/noop/
RUN \
    echo 'installing pip requirements' && \
    pip3 install --upgrade pip && \
    pip3 install setuptools wheel && \
    # Currently we are unable to relieably build cryptography on armv7. This
    # is why we need to use the package shipped by Alpine Linux, which is currently
    # version 3.3.2. Since poetry does not allow in-place dependency pinning, we need
    # to install the deps using pip.
    cat /requirements.txt | grep -Ev 'cryptography|autobahn' | pip3 install -r /dev/stdin cryptography==3.3.2 autobahn==21.2.1 && \
    rm -rf $PIP_DOWNLOAD_CACHE

ARG install_dev_deps=0
RUN \
    if [ "$install_dev_deps" = "1" ] ; then \
      echo "Installing dev dependencies" && \
    cat /dev-requirements.txt | grep -Ev 'cryptography|autobahn' | pip3 install -r /dev/stdin cryptography==3.3.2 autobahn==21.2.1 \
    ; else  \
      echo "Skipping dev deps installation" \
    ; fi


FROM alpine:3.16 as build-image

COPY --from=builder /venv /venv
# emulate activation by prefixing PATH
ENV PATH="/venv/bin:$PATH"

RUN apk add --no-cache \
    libmagic \
    bash \
    gettext \
    python3 \
    jpeg-dev \
    ffmpeg \
    libpq \
    libxml2 \
    libxslt \
    py3-cryptography \
		libldap \
    && \
    ln -s /usr/bin/python3 /usr/bin/python

COPY . /app
WORKDIR /app

RUN find . -type d -exec chmod 755 {} \+

ENTRYPOINT ["./compose/django/entrypoint.sh"]
CMD ["./compose/django/server.sh"]
