Récupérer l'ancien serveur
Lancer une mise à jour ordinaire sur un changement de majeure n’est pas une erreur qui se paie, mais elle emporte l’ancien serveur avant que vous l’ayez dumpé. Cette page le ramène, le temps du dump, puis vous remet à Montée de version PostgreSQL pour finir.
Ce que vous avez sous les yeux
Section intitulée « Ce que vous avez sous les yeux »docker compose up -d --build construit l’image, recrée le conteneur de la base dans la nouvelle
majeure, attend une santé qu’il n’obtient jamais, et sort en 1 sur
dependency failed to start: container badlen-db-1 is unhealthy. docker compose logs db dit
pourquoi, répété une fois par redémarrage :
Error: in 18+, these Docker images are configured to store database data in a format which is compatible with "pg_ctlcluster" ... Counter to that, there appears to be PostgreSQL data in: /var/lib/postgresqlC’est le refus qui fait son travail : le serveur s’est arrêté avant de toucher à quoi que ce soit, le volume porte donc encore votre base exactement comme l’ancienne majeure l’a laissée. Ce que vous n’avez plus, c’est un serveur capable de la lire.
En ramener un
Section intitulée « En ramener un »À côté de la pile, sur le même volume et dans la disposition dans laquelle il a été écrit. Le volume dit quelle majeure l’a écrit :
export PGPASSWORD=$(grep -m1 '^POSTGRES_PASSWORD=' .env | cut -d= -f2-)docker compose stop app dbdocker run --rm -v badlen_pgdata:/vol alpine cat /vol/PG_VERSION # la majeure à ramener, par exemple 16docker run --rm -d --name badlen-db-old --network badlen_default \ -e POSTGRES_PASSWORD="$PGPASSWORD" -v badlen_pgdata:/var/lib/postgresql/data postgres:16-alpineuntil docker exec badlen-db-old pg_isready -U badlen -q; do sleep 1; donedocker run --rm --network badlen_default -e PGPASSWORD postgres:18-alpine \ pg_dump -h badlen-db-old -U badlen -d badlen > badlen-dump.sqlgrep -c 'PostgreSQL database dump complete' badlen-dump.sql # doit afficher 1docker stop badlen-db-oldPuis reprenez Montée de version PostgreSQL à son
docker compose down, le dump étant déjà pris.