Rationalisation des mises à niveau PostgreSQL avec Docker et pgautoupgrade

La mise à niveau des bases de données PostgreSQL dans les environnements Docker peut être une tâche ardue, nécessitant souvent des étapes manuelles méticuleuses pour assurer l’intégrité des données et minimiser les temps d’arrêt.

L’image pgautoupgrade Docker offre une solution automatisée, simplifiant le processus et réduisant les erreurs potentielles.

Lors du choix d’une image Docker, il est crucial de prendre en compte les différences entre les images basées sur Debian et les images basées sur Alpine pour assurer la compatibilité avec la version PostgreSQL vers laquelle vous souhaitez mettre à niveau.

1. Introduction à pgautoupgrade

L’image [pgautoupgrade] peut automatiquement mettre à niveau la version de PostgreSQL utilisée dans votre répertoire de données. Après la mise à niveau, il démarre le serveur PostgreSQL, assurant une transition transparente.

2. Premiers pas avec pgautoupgrade

Pour commencer à utiliser pgautoupgrade, vous devrez mettre à jour votre configuration Docker Compose. La gestion de la base de données PostgreSQL dans un conteneur de base de données est cruciale pour exécuter des commandes, modifier le répertoire de données et restaurer efficacement les vidages de base de données.

2.1 Configuration de base de l’image Docker

Modifiez votre fichier docker-compose.yml pour y inclure l’image pgautoupgrade :

services:
  db:
    image: "pgautoupgrade/pgautoupgrade:alpine"
    volumes:
      - postgres_data:/var/lib/postgresql/data/

Avant d’apporter des modifications à la configuration de Docker Compose, il est crucial de sauvegarder les données de votre base de données. Cela garantit que vous pouvez restaurer vos données en cas de problème pendant la mise à niveau.

Par exemple, copiez le dossier de l’ancienne version vers la nouvelle : cp -rav $OLD $NEW

2.2 Utilisation d’une version spécifique de PostgreSQL

Pour une version PostgreSQL spécifique, utilisez une balise de version pour assurer la compatibilité avec les environnements de production ou les extensions :

services:
  db:
    image: "pgautoupgrade/pgautoupgrade:17-alpine"
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      POSTGRES_PASSWORD: mysecretpassword
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres

REMARQUE : à partir de la version 18, PGDATA a été modifié pour s’aligner sur la structure de répertoires standard de pg_ctlcluster, et le répertoire VOLUME a été déplacé de /var/lib/postgresql/data vers /var/lib/postgresql

services:
  db:
    image: "pgautoupgrade/pgautoupgrade:18-alpine"
    volumes:
      - postgres_data:/var/lib/postgresql/
    environment:
      POSTGRES_PASSWORD: mysecretpassword
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres

Le processus de mise à niveau détecte les fichiers de base de données obsolètes et les met automatiquement à jour pour assurer la compatibilité avec la dernière version de PostgreSQL. Cet exemple utilise PostgreSQL 18 sur Alpine Linux.

3. Mode One Shot pour mettre à niveau automatiquement

Si vous voulez juste effectuer la mise à niveau sans démarrer PostgreSQL par la suite, vous pouvez utiliser le mode “One Shot”. Le mode One Shot effectue une mise à niveau sur place, garantissant que les données de la base de données sont mises à niveau sans les déplacer vers un emplacement séparé.

Pour utiliser le mode One Shot, ajoutez la variable d’environnement PGAUTO_ONESHOT avec la valeur « yes » lors de l’exécution du conteneur :

$ docker run --rm --name pgauto -it \
	--mount type=bind,source=/path/to/your/database/directory,target=/var/lib/postgresql/data \
	-e POSTGRES_PASSWORD=password \
	-e POSTGRES_DB=postgres \
	-e POSTGRES_USER=postgres \
	-e PGAUTO_ONESHOT=yes \
	<NAME_OF_THE_PGAUTOUPGRADE_IMAGE>

à partir de la version 18

$ docker run --rm --name pgauto -it \
	--mount type=bind,source=/path/to/your/database/directory,target=/var/lib/postgresql \
	-e POSTGRES_PASSWORD=password \
	-e POSTGRES_DB=postgres \
	-e POSTGRES_USER=postgres \
	-e PGAUTO_ONESHOT=yes \
	<NAME_OF_THE_PGAUTOUPGRADE_IMAGE>

4. Principales caractéristiques du processus de mise à niveau dans pgautoupgrade

pgautoupgrade offre plusieurs fonctionnalités précieuses pour gérer les mises à niveau PostgreSQL dans les environnements Docker :

  1. Mises à niveau automatisées : Mise à niveau automatique des versions de PostgreSQL à l’aide d’un conteneur PostgreSQL Docker, ce qui réduit l’intervention manuelle et facilite les mises à niveau transparentes.

  2. Compatibilité : Prend en charge plusieurs versions de PostgreSQL, assurant la flexibilité du déploiement. L’utilisation de la dernière version de PostgreSQL est importante pour accéder aux fonctionnalités et améliorations les plus récentes.

  3. Mode One-Shot : Permet des exécutions uniquement à la mise à niveau sans démarrer PostgreSQL, utile pour les tests et la validation.

5. Considérations d’utilisation et meilleures pratiques

Lorsque vous utilisez pgautoupgrade, gardez ces considérations à l’esprit :

  • Sauvegardes : assurez-vous toujours d’avoir une sauvegarde avant d’effectuer des mises à niveau pour vous protéger contre la perte potentielle de données. Il est crucial de sauvegarder vos fichiers de base de données pour éviter tout problème pendant le processus de mise à niveau.

  • Test : Utilisez les scripts de test fournis pour valider le processus de mise à niveau dans un environnement contrôlé. Soyez conscient des problèmes potentiels lors de la transition des images basées sur Debian à Alpine Linux, et assurez des tests approfondis pour éviter les problèmes de compatibilité.

6. Conclusion

En tirant parti de pgautoupgrade, les dévs et ops peuvent rationaliser le processus de mise à niveau de PostgreSQL dans Docker, améliorant ainsi l’efficacité et la fiabilité. Cet outil est particulièrement utile pour les environnements où il est essentiel de maintenir des versions de base de données à jour sans compromettre la stabilité opérationnelle.

Pour des instructions détaillées et une utilisation avancée, visitez le référentiel GitHub pgautoupgrade.