Python Lernhandbuch

Kapitel 16: Alles in Docker betreiben

Musterlösung mit Erklärung

Vergleiche Schritt für Schritt mit deinem Programm in VS Code. Wenn alles passt, markiere die Übung als erledigt.
Aufgabe noch einmal lesen
  1. Bringe die Kundenverwaltung aus den Kapiteln 14 und 15 mit Postgres in Compose zum Laufen.
  2. Lege die Datenbank beim ersten Start automatisch an. Ergänze dazu in lifespan (Kapitel 14) nach pool.open() einen Aufruf, der CREATE TABLE IF NOT EXISTS kunden ... ausführt.
  3. Begrenze beide Container auf 256 MB Arbeitsspeicher und prüfe mit docker stats, wie viel sie tatsächlich nutzen.

Die Dateien Dockerfile und compose.yaml sind oben schon vollständig. Die Ergänzung in main.py:

python
SCHEMA = '''
CREATE TABLE IF NOT EXISTS kunden (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    stadt TEXT,
    umsatz NUMERIC(10, 2) NOT NULL DEFAULT 0
)
'''


@asynccontextmanager
async def lifespan(app: FastAPI):
    pool.open()
    with pool.connection() as conn:
        conn.execute(SCHEMA)
    yield
    pool.close()

Starten und prüfen:

bash
docker compose up -d --build
docker compose logs -f app
curl http://localhost:8000/api/kunden        # sollte [] liefern
docker stats --no-stream                      # Speicher und CPU der Container

Was passiert:

  • docker compose up baut das Image aus dem Dockerfile, startet Postgres, wartet auf den Healthcheck und startet dann die App.
  • Die Tabelle wird beim Start angelegt, falls sie fehlt (IF NOT EXISTS). Bei jedem weiteren Start passiert nichts, die Daten bleiben erhalten.
  • Die Daten liegen im Volume dbdaten. Du kannst die Container löschen und neu bauen, ohne Daten zu verlieren. Nur docker compose down -v löscht auch das Volume.
  • Eine einfache FastAPI-App mit Postgres nutzt typischerweise nur wenige zehn bis etwa 100 MB Arbeitsspeicher. Prüfe das mit docker stats bei dir selbst.

Warum so: Ein Compose-File beschreibt die ganze Umgebung als Text. Du kannst es auf einen anderen Server kopieren und mit einem Befehl alles starten, und mit deinen eigenen Werkzeugen (Versionsverwaltung) nachvollziehen, was sich wann geändert hat.