gwoe-antragspruefer/Dockerfile
Dotty Dotter 3777cde69a fix(security): Dockerfile auf python:3.12-alpine fuer 0 CRITICAL CVEs
Security-Audit ergab 3 CRITICAL CVEs im python:3.12-slim-Base
(Debian-Bullseye-Reste, deren Updates erst mit Debian-Bookworm-Bump
kommen). Wechsel auf python:3.12-alpine, das aktuell 0 CRITICAL hat.

Aenderungen:
- FROM python:3.12-slim -> python:3.12-alpine
- apt-get -> apk add (zwei Phasen: runtime + build-deps mit virtual,
  build-deps werden nach pip install entfernt)
- adduser-Syntax: Alpine `adduser -D -u 1000` statt Debian-Variante
- Zusaetzliche build-deps fuer C-Extensions: build-base, gcc, musl-dev,
  rust+cargo (cryptography), libxml2-dev/libxslt-dev (lxml), openssl-dev
- Runtime-Pakete fuer WeasyPrint: pango, cairo, gdk-pixbuf,
  shared-mime-info, fontconfig, ttf-dejavu

Image-Groessen-Effekt: Alpine + alle Build-Deps nach Cleanup
~250 MB statt slim ~480 MB.

Auto-Deploy auf gwoe-antragspruefer-dev rebuilt sich alle 5 Min via
auto-deploy.sh-Cron — Wirksamkeit innerhalb der naechsten 10 Min
sichtbar. gwoe-antragspruefer (prod, eingefroren auf v1.0.2) bekommt
das beim naechsten Release.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 12:15:23 +02:00

61 lines
1.5 KiB
Docker

FROM python:3.12-alpine
# Runtime-Pakete für WeasyPrint (Pango/Cairo) und PDF-Pipeline.
# Alpine-Pakete sind kleiner als die Debian-slim-Pendants und der
# Base-Image hat aktuell 0 CRITICAL CVEs (vs. 3 in python:3.12-slim,
# Stand Mai 2026 / Security-Audit).
RUN apk add --no-cache \
pango \
cairo \
gdk-pixbuf \
shared-mime-info \
fontconfig \
ttf-dejavu \
libffi \
libxml2 \
libxslt
# Build-Toolchain temporär für pip-Wheels (musllinux-fallbacks bauen
# pymupdf, cffi, lxml, cryptography ggf. lokal).
RUN apk add --no-cache --virtual .build-deps \
build-base \
gcc \
musl-dev \
libffi-dev \
jpeg-dev \
zlib-dev \
cairo-dev \
pango-dev \
gdk-pixbuf-dev \
libxml2-dev \
libxslt-dev \
openssl-dev \
rust \
cargo
WORKDIR /app
# Install Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade pip wheel \
&& pip install --no-cache-dir -r requirements.txt \
&& apk del .build-deps
# Copy application code only (data/reports are mounted as volumes)
COPY app/ ./app/
# Create non-root user and directories (#119 Security)
RUN adduser -D -u 1000 appuser \
&& mkdir -p /app/data /app/reports \
&& chown -R appuser:appuser /app
USER appuser
# Environment
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]