Update Postgres Docker Container
Möchte man einen Postgres DB Container updaten, so reicht es leider nicht nur einfach die Container Image Major Version zu erhöhen und den Container neu zu bauen. Man muss hier zuerst die alte Datenbank komplett mit pgdump
sichern, dann den neuen Container ohne Daten hochzufahren und dann den Dump wieder einzuspielen. Es handelt sich hier um ein Update von Postgres 14.x auf 15.x oder 15.x auf 16.x oder 16.x auf 17.x.
Vorbereitung
Um ein Update des Docker Containers zu machen, muss man zuerst einen Datenbank Dump ziehen. Dafür könnt ihr das Docker Postgres Backup Script verwenden:
backup-docker-postgres.sh
Der Output sollte dann die gesicherten Container anzeigen:
Start 202111181033 Backup for Databases: create Backup for Database on Container: * openhab4_postgres_1 202111181033 Backup for Databases completed
prüft am besten im Backupordner ob die Backup Datei auch erstellt wurde:
ls -la /backup/postgres/
Sollte in etwa so aussehen:
total 768 drwxr-xr-x 2 root root 4096 Nov 18 10:33 . drwxr-xr-x 6 root root 4096 Feb 10 2021 .. -rw-r--r-- 1 root root 164084 Nov 16 01:00 openhab3_postgres_1-202111160100.sql.gz -rw-r--r-- 1 root root 164225 Nov 17 01:00 openhab3_postgres_1-202111170100.sql.gz -rw-r--r-- 1 root root 164252 Nov 18 01:00 openhab3_postgres_1-202111180100.sql.gz -rw-r--r-- 1 root root 164318 Nov 18 10:33 openhab3_postgres_1-202111181033.sql.gz
Update
Kommen wir nun zum Update. Dafür müssen wir als erstes unseren Postgres Container stoppen stoppen. In meinem Beispiel handelt es sich um den für Grafana verwendeten Postgres Container.
Der Container hat den Namen: openhab3_postgres_1
, mein docker-compose Projekt liegt unter /opt/openhab3
.
docker stop openhab4-postgres-1
nun schauen wir wie unser volume des Postgres Containers heißt:
docker volume list
und löschen den Inhalt des Ordners im Filesystem.
rm -rf /var/lib/docker/volumes/openhab4_data_postgres/_data/*
nun können wir die Version im docker-compose.yml
erhöhen (14 auf 15) und das Projekt neu deployen:
/opt/openhab3/docker-compose.yml
postgres:
image: postgres:17
restart: always
volumes:
- data_postgres:/var/lib/postgresql/data/
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_DB=${POSTGRES_DB}
- TZ=${TZ}
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
backend-nw:
aliases:
- postgresdb
cd /opt/openhab4/
docker compose up -d
Dann lesen wir die Daten des neuen Postgres Datenbank Containers aus
docker compose exec postgres env
Wir brauchen den Usernamen und den Datenbanknamen für den Restore. diesen starten wir dann mit folgendem Befehl:
zcat /backup/postgres/openhab4-postgres-1-202307271550.sql.gz |docker exec -i openhab4-postgres-1 psql -U grafana -d grafanadb
Nun kann man prüfen ob der Restore geklappt hat. Dazu kann man sich mit der Datenbank verbinden und einfach ein SHOW TABLES machen:
docker exec -ti openhab4-postgres-1 psql -U grafana -d grafanadb
dann den Query absetzen
\dt
Grafana Special
ich musst bei mir, wieso auch immer, das Passwort des Grafana Users nochmal setzen. Dafür einfach an die Datenbank verbinden:
docker exec -ti openhab4-postgres-1 psql -U grafana -d grafanadb
und dann den folgenden SQL Query absetzten. Ändert "password" in euere Passwort ab.
ALTER USER grafana WITH PASSWORD 'password';
\q