Mettre à jour sa base de donnée postgres conteneurisée

Tutoriel surtout pour moi si je dois le refaire...

Publié le : 8/29/2025

La raison d’être de ce tutoriel

Ce tutoriel rassemble différents éléments que j’ai pu trouver sur internet et qui, mis bout à bout, ont fonctionné pour moi dans le cadre de l’upgrade d’un conteneur postgres au sein d’une appli dockerisée avec un docker-compose.yml.
Je vous souhaite qu’il marche aussi pour vous mais malheureusement je ne peux rien garantir et surtout, mes compétences n’étaient pas immenses dans le domaine, je ne pourrais probablement pas vous aider au-delà de ce maigre tutoriel !

Postulat de base

Pour ce tutoriel, j’assume que le conteneur postgres est lié à d’autres via un fichier docker-compose.yml.
Ce conteneur postgres s’appelle db, il dispose d’un utilisateur postgres et d’une base de donnée db-app.
Bien évidemment, je vous recommande d’arrêter l’ensemble des conteneurs liés à l’application et de faire un backup de vos données !

Enfin les explications !

  1. Éteignez tous les conteneurs liés à la db

docker compose down

  1. Démarrez uniquement celui de la db

docker compose up -d db

  1. Créez un dump de la base de donnée dans un fichier

docker exec -it <nom-du-container-db> pg_dumpall -U postgres > ./upgrade_backup.sql

  1. Vérifiez que le dump a fonctionné

vi upgrade_backup.sql

  1. Arrêtez le conteneur

docker compose stop db

  1. Changez la version de postgres dans votre docker-compose.yml

vi docker-compose.yml
changer la ligne image: docker.io/library/postgres:13 avec la version que vous souhaitez utiliser

  1. Récupérez la nouvelle image du conteneur pg

docker compose pull

  1. Pour évitez des problèmes, il en souvent conseillé de supprimer l’ancienne db, pour qu’elle soit reconstruite selon l’attendu de la nouvelle version de pg. 2 possibilités ici :

    1. Votre db est un volume lié à un dossier, à ce moment-là, vous pouvez supprimer directement le contenu du dossier
    2. Votre db est un volume créé par docker, alors il vous faudra bien supprimer le volume.
      Pour ça vous pouvez faire :

    docker volume ls pour identifier le volume concerné
    docker volume rm <volume-pgdata> pour le supprimer

  2. Démarrez le conteneur avec la nouvelle image (et uniquement lui)

docker compose up -d db

vous pouvez vérifiez si tout est bon avec docker compose logs --tail 100 --timestamps db

  1. Si tout a bien démarré alors il est l’heure de peupler la db avec le précédent dump

docker exec -i <nom-du-container-db> psql -U postgres db-app < upgrade_backup.sql

ATTENTION

Il est possible ici d’arriver à une erreur d’authentification (ce qui m’est arrivé), dans ce cas, je vous conseille d’éteindre le conteneur db, de supprimer le volume associé (comme vu à l’étape 8) et de le recréer (étape 9).
Après cela, voici les étapes :

  1. création d’un script pg_extract.sh

touch pg_extract.sh
vi pg_extract.sh Le script :

#!/bin/bash
[ $# -lt 2 ] && { echo "Usage: $0 <postgresql dump> <dbname>"; exit 1; }
sed  "/connect.*$2/,\$!d" $1 | sed "/PostgreSQL database dump complete/,\$d"

cat pg_extract.sh pour contrôler chmod +x pg_extract.sh pour le rendre executable

  1. Jouer le script avec :

./pg_extract.sh upgrade_backup.sql db-app >> upgrade_backup_db-app.sql

  1. Rejouer la commande de l’étape 10 avec le nouveau fichier sql
  1. Une fois le peuplement de la db terminée, vous pouvez l’arrêter

docker stop <nom-du-container-db>

  1. C’est désormais le moment de relancer l’ensemble et de vérifier le résultat !

docker compose up -d

Conclusion

Si tout s’est bien passé, vous avez désormais votre application fonctionnel avec votre conteneur postgres à jour de la version que vous avez choisi !
J’ai dû passer par là pour mettre à jour le conteneur postgres de mon application Paperless-ngx et j’avais simplement perdu le logo et le nom personnalisé de l’application à la fin de l’opération. Tous mes documents étaient bien là et tout le reste fonctionnait, je prends ça comme une victoire !
Si jamais en passant par là vous comprenez le script et vous auriez des pistes d’améliorations, n’hésitez pas à me contacter !

Merci d’avoir suivi ce tutoriel et bonne journée à vous !