Mettre à jour un conteneur de base de données

Une version mineure lit les mêmes fichiers de données : change le tag, garde le volume. Une version majeure ne le peut pas : exporte les données avec l'ancienne version et restaure-les dans la nouvelle.

Comment ça marche

PostgreSQL 16.4 vers 16.6, c'est un redémarrage sur le même volume. 16 vers 17 change le format sur disque : pg_dump (ou pg_dumpall) pendant que 16 tourne, démarre 17 sur un nouveau volume vide, puis charge l'export avec psql (pg_restore pour le format custom). pg_upgrade convertit sur place, plus vite pour les grosses bases, mais demande les binaires des deux versions dans une même image.

Ce qui casse

Faire pointer postgres:17 vers un volume écrit par 16 échoue au démarrage : database files are incompatible with server. Supprimer le volume pour le faire démarrer perd tout. pg_dump sans -d exporte la base qui porte le nom de l'utilisateur, souvent une base postgres vide. Garde l'ancien volume tant que la nouvelle version n'a pas fait ses preuves : c'est le retour arrière.

Dans un terminal

docker compose exec -T db pg_dump -U postgres -d shop > shop.sql
# compose.yaml: postgres:17 on a new volume
docker compose up -d
docker compose exec -T db psql -U postgres -d shop < shop.sql

Regarde-le casser, puis répare-le

Écris le Dockerfile ou le fichier compose, tape les commandes docker, et regarde un serveur simulé les exécuter à travers redémarrages, mises à jour et trafic. Gratuit pour commencer.