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 !
- Éteignez tous les conteneurs liés à la db
docker compose down
- Démarrez uniquement celui de la db
docker compose up -d db
- 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
- Vérifiez que le dump a fonctionné
vi upgrade_backup.sql
- Arrêtez le conteneur
docker compose stop db
- Changez la version de postgres dans votre docker-compose.yml
vi docker-compose.yml
changer la ligneimage: docker.io/library/postgres:13
avec la version que vous souhaitez utiliser
- Récupérez la nouvelle image du conteneur pg
docker compose pull
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 :
- Votre db est un volume lié à un dossier, à ce moment-là, vous pouvez supprimer directement le contenu du dossier
- 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 supprimerDé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
- 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 :
- 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ôlerchmod +x pg_extract.sh
pour le rendre executable
- Jouer le script avec :
./pg_extract.sh upgrade_backup.sql db-app >> upgrade_backup_db-app.sql
- Rejouer la commande de l’étape 10 avec le nouveau fichier sql
- Une fois le peuplement de la db terminée, vous pouvez l’arrêter
docker stop <nom-du-container-db>
- 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 !