Zum Inhalt springen

Update Postgres Docker Container

Aus LHlab 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 oder 17.x auf 18.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:
  * openhab5-postgres-1

202511181033 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:

-rw-r--r-- 1 root root 553K Jan 16 14:02 openhab5-postgres-1-202601161402.sql.gz -rw-r--r-- 1 root root 553K Jan 17 14:02 openhab5-postgres-1-202601171402.sql.gz -rw-r--r-- 1 root root 553K Jan 18 14:02 openhab5-postgres-1-202601181402.sql.gz -rw-r--r-- 1 root root 553K Jan 19 09:17 openhab5-postgres-1-202601190917.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 openhab5-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/openhab5_data_postgres/_data/*

nun können wir die Version im docker-compose.yml erhöhen (14 auf 15) und das Projekt neu deployen: /opt/openhab5/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/openhab5/
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/openhab5-postgres-1-202307271550.sql.gz |docker exec -i openhab5-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 openhab5-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 openhab5-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