Skip to content

[WIP] Fix CI failure in PR #91 due to Dockerfile issue#92

Merged
jancwe merged 2 commits intocopilot/optimize-dockerfile-layer-orderfrom
copilot/ci-fix-dockerfile-issue
Mar 21, 2026
Merged

[WIP] Fix CI failure in PR #91 due to Dockerfile issue#92
jancwe merged 2 commits intocopilot/optimize-dockerfile-layer-orderfrom
copilot/ci-fix-dockerfile-issue

Conversation

Copy link
Contributor

Copilot AI commented Mar 21, 2026

  • Fix Dockerfile on branch copilot/optimize-dockerfile-layer-order (PR Optimize Dockerfile: squash 5 layers #91):
    • Add missing package-data directories (pdf_templates, templates, static) to the dummy-package setup in step 2
    • Add missing _version.py dummy file needed by __init__.py import
Original prompt

CI-Fehler in PR #91 beheben

PR #91 (Branch: copilot/optimize-dockerfile-layer-order) hat das Dockerfile optimiert, aber die CI schlägt fehl – der App-Container startet nicht innerhalb des Zeitlimits.

Aktuelles (fehlerhaftes) Dockerfile auf dem Branch

FROM python:3.14-slim

LABEL org.opencontainers.image.version="0.1.0" \
      org.opencontainers.image.title="formflow" \
      org.opencontainers.image.description="Dynamischer Formular- & PDF-Generator"

WORKDIR /app

# 1) System-Deps (ändert sich sehr selten)
RUN apt-get update && apt-get install -y \
    libpango-1.0-0 \
    libpangoft2-1.0-0 \
    libjpeg-dev \
    libopenjp2-7-dev \
    libffi-dev \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 2) Python-Deps NUR bei pyproject.toml-Änderung
#    Trick: Nur pyproject.toml kopieren + Dummy-Package,
#    damit pip install die Dependencies cached.
COPY pyproject.toml .
RUN mkdir -p src/formflow && \
    echo '__version__ = "0.1.0"' > src/formflow/__init__.py && \
    pip install --no-cache-dir . && \
    rm -rf src/formflow

# 3) Anwendungscode (ändert sich häufig)
COPY src/ src/
RUN pip install --no-cache-dir --no-deps .

# 4) Restliche Dateien (app.py, forms/, etc.)
COPY app.py .
COPY forms/ forms/

# 5) Statische Dateien + Verzeichnisse
RUN mkdir -p /app/static /data/forms /data/pdf_templates && \
    cp -r src/formflow/static/. /app/static/

EXPOSE 5000

CMD ["gunicorn", "-w", "1", "--timeout", "120", "--max-requests", "500", "--max-requests-jitter", "50", "-b", "0.0.0.0:5000", "app:app"]

Wahrscheinliche Ursachen des Start-Fehlers

  1. Dummy-Package-Trick fehlen Package-Data-Verzeichnisse: Die pyproject.toml deklariert package-data für pdf_templates/*.html, templates/*.html und static/**/*. Wenn setuptools diese Verzeichnisse beim Dummy-Build nicht findet, kann die Installation fehlschlagen oder unvollständig sein. Der Dummy-__init__.py allein reicht nicht – es müssen auch leere Verzeichnisse für die package-data-Globs existieren.

  2. rm -rf src/formflow am Ende von Schritt 2 entfernt das gesamte Verzeichnis, aber pip install --no-deps . in Schritt 3 muss das Package erneut installieren. Da --no-deps verwendet wird, werden Dependencies nicht erneut installiert (das ist korrekt), aber das Package selbst muss korrekt gebaut werden können – dafür braucht es die package-data-Verzeichnisse.

Fix

Der Dummy-Package-Trick muss angepasst werden, damit setuptools das Package auch mit den package-data-Globs bauen kann. Die einfachste Lösung:

FROM python:3.14-slim

LABEL org.opencontainers.image.version="0.1.0" \
      org.opencontainers.image.title="formflow" \
      org.opencontainers.image.description="Dynamischer Formular- & PDF-Generator"

WORKDIR /app

# 1) System-Deps (ändert sich sehr selten)
RUN apt-get update && apt-get install -y \
    libpango-1.0-0 \
    libpangoft2-1.0-0 \
    libjpeg-dev \
    libopenjp2-7-dev \
    libffi-dev \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 2) Python-Deps NUR bei pyproject.toml-Änderung
#    Trick: Nur pyproject.toml kopieren + Dummy-Package mit leeren
#    Verzeichnissen für package-data Globs, damit pip install die
#    Dependencies cached.
COPY pyproject.toml .
RUN mkdir -p src/formflow/pdf_templates src/formflow/templates src/formflow/static && \
    echo '__version__ = "0.1.0"' > src/formflow/__init__.py && \
    echo '__version__ = "0.1.0"' > src/formflow/_version.py && \
    pip install --no-cache-dir . && \
    rm -rf src/formflow

# 3) Anwendungscode (ändert sich häufig)
COPY src/ src/
RUN pip install --no-cache-dir --no-deps .

# 4) Restliche Dateien (app.py, forms/, etc.)
COPY app.py .
COPY forms/ forms/

# 5) Statische Dateien + Verzeichnisse
RUN mkdir -p /app/static /data/forms /data/pdf_templates && \
    cp -r src/formflow/static/. /app/static/

EXPOSE 5000

# Verwende Gunicorn als Produktions-WSGI-Server
# -w 1: 1 Worker-Prozess – ausreichend für Low-Traffic-Intranet-Apps.
#        Jeder Worker lädt WeasyPrint (~150-300 MB), daher bewusst gering halten.
#        Für höheren Durchsatz: Wert auf (2 * CPU-Kerne + 1) erhöhen.
# --timeout 120: WeasyPrint-Rendering kann bei komplexen Templates >30s dauern.
# --max-requests 500: Worker wird nach 500 Requests graceful neu gestartet (Schutz gegen Memory Leaks).
# --max-requests-jitter 50: Zufälliger Versatz beim Restart (zukunftssicher bei mehreren Workern).
# -b 0.0.0.0:5000: Binde an alle Interfaces auf Port 5000
CMD ["gunicorn", "-w", "1", "--timeout", "120", "--max-requests", "500", "--max-requests-jitter", "50", "-b", "0.0.0.0:5000", "app:app"]

Wichtige Änderungen im Fix

In Schritt 2:

  • mkdir -p src/formflow/pdf_templates src/formflow/templates src/formflow/static – erstellt die leeren Verzeichnisse, die setuptools für die package-data-Globs in pyproject.toml erwartet
  • echo '__version__ = "0.1.0"' > src/formflow/_version.py – erstellt auch die _version.py, die von __init__.py importiert wird (de...

This pull request was created from Copilot chat.


⚡ Quickly spin up Copilot coding agent tasks from anywhere on your macOS or Windows machine with Raycast.

@jancwe jancwe marked this pull request as ready for review March 21, 2026 15:48
@jancwe jancwe merged commit 4e2677e into copilot/optimize-dockerfile-layer-order Mar 21, 2026
@jancwe jancwe deleted the copilot/ci-fix-dockerfile-issue branch March 21, 2026 15:48
Copilot AI requested a review from jancwe March 21, 2026 15:49
Copilot stopped work on behalf of jancwe due to an error March 21, 2026 15:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants