diff --git a/Dockerfile b/Dockerfile index 983d0ab..8487530 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,81 @@ -FROM python:3.11-slim +# Stage 1: General debian environment +FROM debian:stable-slim AS linux-base -WORKDIR /srv/app +# Assure UTF-8 encoding is used. +ENV LC_CTYPE=C.utf8 +# Location of the virtual environment +ENV UV_PROJECT_ENVIRONMENT="/venv" +# Location of the python installation via uv +ENV UV_PYTHON_INSTALL_DIR="/python" +# Byte compile the python files on installation +ENV UV_COMPILE_BYTECODE=1 +# Python verision to use +ENV UV_PYTHON=python3.12 +# Tweaking the PATH variable for easier use +ENV PATH="$UV_PROJECT_ENVIRONMENT/bin:$PATH" -RUN apt update && \ - apt install --no-install-recommends -y libpq-dev build-essential curl gcc sassc libpango-1.0-0 libpangoft2-1.0-0 libjpeg-dev libopenjp2-7-dev libffi-dev libpangoft2-1.0-0 libcairo2 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 shared-mime-info gettext &&\ - rm -rf /var/lib/apt/lists/* +# Update debian +RUN apt-get update +RUN apt-get upgrade -y -COPY --chown=www-data:www-data . . +# Install general required dependencies +RUN apt-get install --no-install-recommends -y tzdata \ + libpango-1.0-0 \ + libpangoft2-1.0-0 \ + libjpeg-dev \ + libopenjp2-7-dev \ + libffi-dev \ + libpangoft2-1.0-0 \ + libcairo2 \ + libpangocairo-1.0-0 \ + libgdk-pixbuf2.0-0 \ + shared-mime-info \ + gettext \ + tini -run python -m pip install --upgrade pip \ - && python -m pip install uwsgi \ - && python -m pip install -r requirements.txt \ - && python -m pip install . +# Stage 2: Python environment +FROM linux-base AS python-base -ENTRYPOINT [ "uwsgi", "-i", "uwsgi.ini" ] +# Install debian dependencies +RUN apt-get install --no-install-recommends -y \ + libpq-dev \ + build-essential \ + curl \ + gcc \ + sassc + +# Install uv +COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv + +# Create virtual environment and install dependencies +COPY pyproject.toml ./ +COPY uv.lock ./ +RUN uv sync --frozen --no-dev --no-install-project +RUN uv pip install granian + +# Stage 3: Building environment +FROM python-base AS builder-base + +WORKDIR /app +COPY . /app + +# Build static files +RUN python manage.py compilescss +RUN python manage.py collectstatic --no-input + +# Compile translation files +# RUN python manage.py compilemessages + + +# Stage 4: Webapp environment +FROM linux-base AS webapp + +# Copy python, virtual env and static assets +COPY --from=builder-base $UV_PYTHON_INSTALL_DIR $UV_PYTHON_INSTALL_DIR +COPY --from=builder-base $UV_PROJECT_ENVIRONMENT $UV_PROJECT_ENVIRONMENT +COPY --from=builder-base /app /app + +# Start the application server +WORKDIR /app +EXPOSE 8000 +CMD ["docker/entrypoint.sh"] diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 0000000..0b9ea03 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euxo pipefail + +echo "Migrate database..." +python manage.py migrate --settings local_settings + +echo "Start server..." + +granian la_chariotte.wsgi:application \ + --host 127.0.0.1 \ + --port 8000 \ + --interface wsgi \ + --no-ws \ + --loop uvloop