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 upbaut das Image aus demDockerfile, 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. Nurdocker compose down -vlö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 statsbei 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.