PostgreSQL-Versions-Update mit Docker: Schritt für Schritt
PostgreSQL 13 wird aktuell noch unterstützt, erreicht aber am 13. November 2025 sein End of Life.
Und wenn du noch eine alte Version am Laufen hast: Jetzt ist der perfekte Zeitpunkt für ein Upgrade.
In diesem Beitrag zeige ich dir am Beispiel der Datenbank der Anwendung Mautrix Instagram, wie ich von PostgreSQL 12 auf 17 gewechselt bin. Das Vorgehen ist nicht auf diese spezifischen Versionen beschränkt – es funktioniert genauso bei anderen Upgrades, etwa von 10 auf 17 oder 13 auf 17.
Egal also, welche Version du gerade nutzt: Wenn ein Upgrade ansteht, kannst du dich an diesem Ablauf orientieren.
🚫 Warum kein direktes Upgrade im Container?
Wichtiger Punkt: Ich führe keine In-Place-Upgrades bei Docker-Containern durch – und das solltest du auch nicht.
Warum? Weil Docker-Container auf einem unveränderlichen Image-Konzept basieren. Wenn du versuchst, innerhalb des Containers eine neue PostgreSQL-Version zu installieren, verlierst du die Vorteile von Stabilität, Reproduzierbarkeit und Wartbarkeit. Außerdem: Die Upgrade-Tools von PostgreSQL wie pg_upgrade
sind nicht dafür gedacht, innerhalb von Docker-Containern mit gemounteten Volumes genutzt zu werden – das kann richtig schiefgehen.

Stattdessen fahre ich die bewährte Strategie:
Backup (Dump) → neuer Container → Import → Switch
Klingt aufwändig? Ist es aber nicht. Und vor allem: Es ist sicher.
⚙️ Praxisanleitung: PostgreSQL-Datenbank mit Docker umziehen
👉 Bevor du irgendetwas änderst, denk dran: Erst ein vollständiges Backup machen! Ohne Backup keine Migration – ganz egal, wie schnell oder klein die Änderung scheint. Du willst im Fall der Fälle zurückspringen können.
🗂️ Schritt 1: Überblick über den alten Container
Hier war mein ursprünglicher Setup:
mautrix-instagram-db: image: docker.io/postgres:12-alpine container_name: mautrix-instagram-db restart: always environment: - POSTGRES_USER=mautrix-instagram - POSTGRES_PASSWORD=<MEIN-PASSWORT> - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C ports: - "5432:5432" volumes: - ./data/mautrix-instagram/database:/var/lib/postgresql/data
💾 Schritt 2: Backup erstellen
Bevor du irgendwas kaputt machst – Backup!
So einfach geht’s:
docker exec -t mautrix-instagram-db pg_dump -U mautrix-instagram -d mautrix-instagram > mautrix-instagram-db_backup.sql
👉 Was passiert hier eigentlich?
docker exec -t mautrix-instagram-db
→ führt den folgenden Befehl im Containermautrix-instagram-db
aus.pg_dump
→ das PostgreSQL-Tool, um ein Backup (Dump) der Datenbank zu erstellen.-U mautrix-instagram
→ gibt den Benutzer an, mit dem die Datenbank gesichert wird.-d mautrix-instagram
→ wählt die Datenbank aus, die gesichert werden soll.> mautrix-instagram-db_backup.sql
→ leitet die Ausgabe in eine Datei auf dem Host-System um (hier:mautrix-instagram-db_backup.sql
).
Am Ende hast du damit ein vollständiges SQL-Dump deiner bestehenden Datenbank, das du später wieder importieren kannst.
⛔ Schritt 3: Alten Container stoppen
Sobald das Backup sicher ist, kannst du den alten Datenbank-Container und natürlich auch den Applikations-Container herunterfahren:
docker-compose down mautrix-instagram-app mautrix-instagram-db
Damit wird die App getrennt und du kannst sauber mit dem neuen Container starten.
🆕 Schritt 4: Neuen Container aufsetzen
Jetzt kommt PostgreSQL 17 ins Spiel. Ich habe bewusst einen neuen Container verwendet, um die Migration sauber und parallel umzusetzen:
mautrix-instagram-db_neu: image: docker.io/postgres:17-alpine container_name: mautrix-instagram-db_neu restart: always environment: - POSTGRES_USER=mautrix-instagram - POSTGRES_PASSWORD=<MEIN-PASSWORT> - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C ports: - "5436:5432" volumes: - ./data/mautrix-instagram_neu/database:/var/lib/postgresql/data
🚀 Schritt 5: Container starten
Starte den neuen Datenbank-Container mit:
docker-compose up -d mautrix-instagram-db_neu
Und checke die Logs:
docker-compose logs -f mautrix-instagram-db_neu

📥 Schritt 6: Backup einspielen
Zeit, das zuvor erstellte Backup in die neue Datenbank zu laden:
docker exec -i mautrix-instagram-db_neu psql -U mautrix-instagram -d mautrix-instagram < mautrix-instagram-db_backup.sql

Fertig? Super.
📴 Schritt 7: Neuen Container kurz stoppen
Jetzt, wo alles sauber importiert ist:
docker-compose down mautrix-instagram-db_neu
Denn jetzt kommt der Feinschliff.
🛠️ Schritt 8: Docker-Compose anpassen
In der docker-compose.yaml
:
- Falls ein Docker-Netzwerk verwendet wird: Die IP des neuen Containers zurück auf die ursprüngliche setzen
- Port-Zuordnung prüfen und ggf. wieder anpassen
- Container-Namen ändern (den alten Namen wiederverwenden!)
- Den alten Datenbank-Container vollständig entfernen (oder auskommentieren)
- Volume-Pfad kann so bleiben, sofern gewünscht, ansonsten müssen die Verzeichnisse umbenannt werden, Achtung!
🧩 Schritt 9: Finaler Start mit App
Jetzt kommt der große Moment:
docker-compose up -d mautrix-instagram-db mautrix-instagram-app
Und direkt danach:
docker-compose logs -f mautrix-instagram-db mautrix-instagram-app
Jetzt kannst du die Logs und die Anwendung auf Herz und Nieren prüfen.
Wenn alles läuft, hast du’s geschafft – deine Anwendung läuft jetzt mit einer aktuellen PostgreSQL 17-Datenbank!
🎉 Fazit
Wenn du noch auf alten PostgreSQL Datenbanken sitzt, die in Docker laufen, dann solltest du spätestens jetzt langsam aus dem Quark kommen. Nicht nur wegen des EOL-Datums – sondern weil du mit einem modernen Setup viel besser für zukünftige Updates, Sicherheitsanforderungen und Applikationskompatibilität aufgestellt bist.
Mein Tipp: Nimm dir 15 Minuten Zeit, geh die Schritte durch und dann kannst du dich zurücklehnen. Zumindest bis PostgreSQL 17 sein EOL erreicht 😉
👥 Techniverse Community
Matrix, Selfhosting, smarte IT-Lösungen und jede Menge Nerd-Talk – das findest du in der Techniverse Community.
Komm vorbei, tausch dich aus und werde ein Teil von uns.
👉 Unsere Gruppe auf Matrix: #community:techniverse.net
Wir freuen uns auf dich!