Problem: Wir brauchen 2 Datenbanken: jeeeraaah und lib_test
PostgreSQL-Limitierung: Nur EINE Datenbank via POSTGRES_DB Umgebungsvariable
Lösung: Entrypoint-Wrapper - Best Practice fĂŒr Multi-DB-Setup!
Das war deine Frage:
âwarum definieren wir nicht eine zweite umgebungsvariable analog zu postgres_db?â
Antwort:
PostgreSQLâs offizielles Docker-Image unterstĂŒtzt nur diese Standard-Variablen:
POSTGRES_DB - Eine Datenbank (Standard: postgres)POSTGRES_USER - Ein UserPOSTGRES_PASSWORD - Ein PasswortEs gibt kein:
POSTGRES_DB_ADDITIONALPOSTGRES_DBS (Liste)POSTGRES_DB_2Das Image ist nicht dafĂŒr designed, mehrere Datenbanken aus Env-Vars zu erstellen.
Das ist die Standard-Lösung in der Docker-Community!
â
Einheitlich: Beide Datenbanken werden auf dem gleichen Weg erstellt
â
Elegant: Ein Skript, eine klare Verantwortung
â
VerstÀndlich: Alle Datenbanken an einem Ort konfiguriert
â
Erweiterbar: Neue Datenbank? Einfach zur Liste hinzufĂŒgen!
â
Standard: Best Practice in der Docker-Community
Datei: config/shared/docker/postgres-entrypoint-wrapper.sh
# Alle benötigten Datenbanken - ein zentraler Ort!
DATABASES=(
"jeeeraaah:r_uu:Main application database"
"lib_test:r_uu:Library test database"
)
# Funktion erstellt alle Datenbanken nach PostgreSQL-Start
ensure_databases() {
for db_config in "${DATABASES[@]}"; do
# Erstelle Datenbank falls nicht vorhanden
# Idempotent: Kann mehrfach ausgefĂŒhrt werden
done
}
Neue Datenbank hinzufĂŒgen? Einfach zur Liste hinzufĂŒgen:
DATABASES=(
"jeeeraaah:r_uu:Main application database"
"lib_test:r_uu:Library test database"
"analytics:r_uu:Analytics database" # â Neu!
)
Datei: config/shared/docker/docker-compose.yml
postgres-jeeeraaah:
image: postgres:16-alpine
entrypoint: ["/bin/bash", "/usr/local/bin/postgres-entrypoint-wrapper.sh"]
command: ["postgres"]
volumes:
- ./postgres-entrypoint-wrapper.sh:/usr/local/bin/postgres-entrypoint-wrapper.sh:ro
Datei: config/shared/docker/healthcheck/postgres-healthcheck.sh
# Healthcheck hat EINE Aufgabe: PrĂŒfen!
# Datenbank-Erstellung ist NICHT seine Aufgabe!
pg_isready -U r_uu || exit 1
# PrĂŒfe ob alle benötigten Datenbanken existieren
for db in jeeeraaah lib_test; do
# Falls fehlt: exit 1 (unhealthy)
done
Separation of Concerns:
1. Docker startet Container
â
2. Entrypoint-Wrapper startet
â
3. Wrapper startet PostgreSQL (im Vordergrund)
â
4. Wrapper startet Setup-Funktion (im Hintergrund)
â
5. Setup wartet bis PostgreSQL bereit ist
â
6. Setup erstellt jeeeraaah (falls nicht vorhanden)
â
7. Setup erstellt lib_test (falls nicht vorhanden)
â
8. Healthcheck prĂŒft: Beide Datenbanken da? â
â
9. Container ist HEALTHY
jeeeraaah via POSTGRES_DB (Umgebungsvariable)lib_test via Healthcheck (erstellt bei jedem Check)lib_test via Init-Skript (nur beim ersten Start)Der Wrapper kann mehrfach ausgefĂŒhrt werden:
# PrĂŒft immer erst: Existiert DB schon?
if psql -lqt | grep -qw "$dbname"; then
echo "â
Existiert bereits"
else
echo "â Erstelle..."
fi
Alle Datenbanken an einem Ort:
DATABASES=(
"db1:owner:description"
"db2:owner:description"
# Hier neue DBs hinzufĂŒgen!
)
Jeder versteht sofort: âAh, hier werden die Datenbanken konfiguriert!â
/docker-entrypoint-initdb.d/â Problem: LĂ€uft nur beim ersten Start (wenn Volume leer ist)
â Bei bestehendem Volume â wird ĂŒbersprungen
â Problem: Healthcheck sollte nur prĂŒfen, nicht Ă€ndern
â Verletzt Single Responsibility Principle
â Problem: Ressourcen-Verschwendung
â Komplexere Konfiguration
â
Standard-Lösung in der Docker-Community
â
Flexibel, erweiterbar, verstÀndlich
â
Funktioniert mit allen Volumes (neu & bestehend)
| Aspekt | Umgebungsvariable | Entrypoint-Wrapper |
|---|---|---|
| Mehrere DBs | â Nicht unterstĂŒtzt | â Beliebig viele |
| Zentrale Config | â Verteilt | â Ein Ort |
| Erweiterbar | â Schwierig | â Einfach |
| VerstĂ€ndlich | â Unterschiedlich | â Einheitlich |
| Best Practice | â Nein | â Ja |
âkönnen wir das alles nicht einheitlich, elegant, leicht verstĂ€ndlich handhaben?â
JA! Genau das haben wir jetzt:
Die neue Lösung ist bereits implementiert!
# Container mit neuer Lösung starten
cd /home/r-uu/develop/github/java/main/config/shared/docker
docker compose down
docker compose up -d
# Testen
ruu-test
Fertig! Beide Datenbanken werden jetzt einheitlich und elegant erstellt! âš