Docker-Image bauen / build (push) Successful in 1m7s
Der Testlauf war zu langsam. Gemessen statt geraten: 0,68 s Vorbereitung pro Test, bei 81 Tests praktisch die ganze Laufzeit. Ursache war bcrypt. Pro Test wird ein Hash gebildet und geprüft, und das ist absichtlich langsam - genau das soll es im Betrieb sein. Der Aufwand ist jetzt über BCRYPT_ROUNDS einstellbar (Standard bleibt 12) und in den Tests auf 4 gesetzt: dort geht es um die Ablauflogik, nicht um die Stärke des Hashes. Der Dekompressionsbomben-Test erzeugte ein Bild mit 400 Megapixeln, allein dafür 4,8 s. Jetzt wird stattdessen die Grenze heruntergesetzt und ein kleines Bild verwendet - dieselbe Codestelle, ohne die Wartezeit. Ausserdem installierten Test- und Anwendungs-Image dieselben Abhängigkeiten zweimal. Dockerfile.test setzt nun auf dem gebauten Anwendungs-Image auf, der Testschritt kommt entsprechend danach. Dabei zwei Fallen, die beide auffielen, weil die Tests plötzlich wieder langsam waren: - Das Basis-Image bringt seinen eigenen Stand von app/ mit. Ohne erneutes Kopieren prüfen die Tests den Code des Basis-Images - ist es veraltet, läuft alles gegen alten Code und meldet Erfolg. - Der ENTRYPOINT des Anwendungs-Images startet eine Datenbank-Migration. Für Tests weder nötig noch erwünscht, darum geleert. Ganze Kette lokal durchgespielt: bauen, testen, Image prüfen - 22 s. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GR4bNaj9GtRu57J4Niii8o
32 lines
1.1 KiB
Docker
32 lines
1.1 KiB
Docker
# Testumgebung - setzt auf dem fertigen Anwendungs-Image auf.
|
|
#
|
|
# Vorteil: die Abhängigkeiten sind dort schon installiert und werden nicht
|
|
# ein zweites Mal geholt. Die Tests laufen ausserdem gegen genau die
|
|
# Fassungen, die auch ausgeliefert werden.
|
|
#
|
|
# Der Quellcode wird trotzdem NEU hineinkopiert. Ohne das würden die Tests
|
|
# gegen den Stand des Basis-Images laufen - ist es veraltet, prüfen sie
|
|
# stillschweigend alten Code und melden Erfolg.
|
|
#
|
|
# ENTRYPOINT wird geleert: der des Anwendungs-Images führt eine
|
|
# Datenbank-Migration aus, die für die Tests weder nötig noch erwünscht ist.
|
|
#
|
|
# Bewusst ohne Bind-Mount: läuft der CI-Runner selbst in einem Container,
|
|
# zeigt $PWD auf einen Pfad, den der Docker-Daemon des Hosts nicht kennt.
|
|
# Der Mount wäre leer und die Tests liefen ohne Fehlermeldung ins Leere.
|
|
ARG BASIS=kleiderboerse-app
|
|
FROM ${BASIS}
|
|
|
|
USER root
|
|
ENTRYPOINT []
|
|
|
|
COPY requirements-dev.txt ./
|
|
RUN pip install --no-cache-dir -r requirements-dev.txt
|
|
|
|
COPY alembic.ini ./
|
|
COPY alembic/ ./alembic/
|
|
COPY app/ ./app/
|
|
COPY tests/ ./tests/
|
|
|
|
CMD ["python", "-m", "pytest", "-q"]
|