Update Postgres Docker Container

Aus Laub-Home Wiki

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

Quellen