Attendre la base de données de l’archive

DockerBeginner
Pratiquer maintenant

Introduction

The Common Archive conserve quatre témoignages de quartier dans PostgreSQL. Son site de référence fonctionne, mais la nouvelle archive a tenté d’importer son catalogue avant que la base ne puisse accepter des connexions. Fiabilisez le premier démarrage en distinguant un conteneur actif d’une base de données utilisable.

Vous devez connaître les bases de Docker, les journaux de conteneurs, les ports publiés et les chemins dans le terminal. Ce TP enseigne les relations YAML, le petit fichier Compose, un contrôle de santé de la base et les conditions de dépendance. Aucune connaissance de SQL, d’administration PostgreSQL ou de programmation applicative n’est requise. L’image de base de données complète, l’importateur, le site et les données sont fournis.

Utilisez Workstation, Reference Archive, Your Archive et Collection Notes. Toutes les ressources sont des témoignages pédagogiques synthétiques. Les délais délibérés de base et d’importation rendent visibles les états de démarrage ; ils ne décrivent pas des durées en production. Prévoyez environ 45 minutes, lecture et erreurs ordinaires comprises ; il s’agit d’une estimation de l’auteur.

Attendre une base de données utilisable

Dans cette étape, vous allez réparer une dépendance dans une application petite mais complète. Effectuez les observations avant de remplacer la configuration.

Utiliser l’archive normale

Commencez dans Reference Archive. Recherchez Market morning avec Search the collection et Search. Deux fiches partagent ce titre, mais représentent des histoires différentes. Ouvrez-les toutes les deux, examinez leurs identifiants, années et catégories, puis utilisez Download transcript. Revenez avec Back to collection, effacez la recherche et examinez Ferry voices. Les téléchargements sont de véritables textes provenant des fiches de la base, pas des marqueurs de réussite.

Passez à Your Archive. Il indique que le catalogue n’est pas actif ; il n’emprunte pas la référence. Collection Notes fonctionne déjà car ce service d’accueil ne lit aucune ligne de la base. Un conteneur à l’état Up ne prouve pas que le catalogue est complet.

Lire l’échec réel du démarrage

La collection de référence contient quatre fiches ; les deux entrées Market morning ont des identités distinctes :

Le catalogue de référence complet

Passez à Workstation, qui démarre dans /home/labex/project/archive-startup. cd revient dans ce dossier si nécessaire. cat affiche les fichiers :

cd /home/labex/project/archive-startup
cat compose.yaml

Compose lit du YAML. L’indentation regroupe les propriétés de chaque service ; utilisez des espaces, pas des tabulations. Les quatre entrées sous services: sont :

Service Travail réel État réussi
db PostgreSQL stocke les fiches Actif et acceptant les connexions TCP
importer Une seule transaction importe le CSV fourni Terminé avec le code 0
catalog Recherche et fournit les fiches et transcriptions Actif après la réussite de l’importation
welcome Fournit Collection Notes sans lire la base Peut fonctionner avant l’importation

image sélectionne une image préparée. entrypoint démarre un programme fourni ; vous ne le modifiez pas. environment transmet des paramètres nommés à ce programme. PGHOST, PGUSER, PGPASSWORD et PGDATABASE indiquent aux clients quelle base et quel compte de formation utiliser. Ces identifiants limités à ce périmètre sont fournis pour ce TP. POSTGRES_* prépare ce compte dans un nouveau stockage de données. Ne changez pas l’authentification et ne remplacez pas la base.

Le volume data conserve les fichiers de base de données de ce projet. Le chemin relatif ./scenario monte le dossier d’entrée fourni dans l’importateur en lecture seule, ce qu’indique :ro. La base lit aussi son script de délai pédagogique de premier démarrage fourni. Le port publié 8090:8080 relie Your Archive au catalogue. La page d’accueil utilise un autre port. Un projet Compose regroupe des ressources ; -p archive ci-dessous cible toujours votre archive d’apprenant, tandis que la référence utilise un projet et un volume différents.

ps -a inclut les conteneurs arrêtés et jamais démarrés. logs lit leur sortie réelle :

docker compose -p archive ps -a
docker compose -p archive logs db importer

La base finit par annoncer qu’elle est prête, mais l’importateur a déjà échoué à se connecter. Une base prête plus tard ne relance pas automatiquement une importation échouée. Le catalogue reste non démarré, car sa dépendance fournie attend déjà la réussite de l’importateur.

PostgreSQL utilise brièvement un serveur temporaire d’initialisation avant de démarrer son écoute TCP finale. Un contrôle portant uniquement sur son socket Unix local peut devenir prêt trop tôt pour un autre conteneur. pg_isready indique si un serveur accepte des connexions ; il ne prouve pas que les identifiants ou le contenu du catalogue sont corrects.

La sonde de lecture seule suivante utilise volontairement le mauvais port TCP. exec exécute la sonde dans db, -T désactive l’allocation de terminal, -h choisit l’adresse, -p le port, et -U/-d nomment l’utilisateur et la base fournis. Aucun serveur n’écoute sur le port 6543 : attendez-vous donc à no response et au code de sortie natif 2 :

docker compose -p archive exec -T db pg_isready -h 127.0.0.1 -p 6543 -U archivist -d archive

Il s’agit d’un échec de sonde, pas d’une perte des données du catalogue. La base finale écoute sur son port TCP normal 5432. Un contrôle de santé doit cibler ce service réel.

Exprimer la disponibilité et démarrer avec de nouvelles données

Conservez inchangés les paramètres applicatifs et les fichiers fournis. Ajoutez un véritable healthcheck à db et remplacez la condition de base de l’importateur service_started par service_healthy. test est la commande que Docker exécute dans le conteneur de base. Le tableau de type JSON utilise CMD pour exécuter directement le programme nommé, sans shell. -h 127.0.0.1 sélectionne l’écoute TCP finale ; le port par défaut est 5432. interval: 1s, timeout: 2s et retries: 40 assurent des sondes répétées et bornées, pas une attente fixe qui prétendrait que la base est prête.

La condition service_completed_successfully du catalogue reste en place : une importation ponctuelle réussie se termine avec 0 et n’a pas besoin de rester à l’état Running. Son échec doit bloquer le catalogue. La page d’accueil n’a pas de dépendance à l’importation, car elle n’a pas besoin des données importées.

Le here-document littéral suivant écrit la configuration complète afin que l’indentation soit reproductible. cat fournit les lignes, > remplace uniquement compose.yaml, et le marqueur COMPOSE entre apostrophes empêche les substitutions du shell jusqu’à sa ligne de fermeture. Tous les autres paramètres applicatifs sont préservés :

cat > compose.yaml <<'COMPOSE'
services:
  db:
    image: dk04-postgres:16
    environment:
      POSTGRES_USER: archivist
      POSTGRES_PASSWORD: training-archive
      POSTGRES_DB: archive
      TRAINING_DB_DELAY: "8"
    volumes:
      - data:/var/lib/postgresql/data
      - ./scenario/slow-init.sh:/docker-entrypoint-initdb.d/10-training-delay.sh:ro
    healthcheck:
      test: ["CMD", "pg_isready", "-h", "127.0.0.1", "-U", "archivist", "-d", "archive"]
      interval: 1s
      timeout: 2s
      retries: 40
  importer:
    image: dk04-archive:1
    entrypoint: ["python3", "-B", "/app/importer.py"]
    environment:
      PGHOST: db
      PGUSER: archivist
      PGPASSWORD: training-archive
      PGDATABASE: archive
      TRAINING_IMPORT_DELAY: "6"
    volumes:
      - ./scenario:/scenario:ro
    depends_on:
      db:
        condition: service_healthy
  catalog:
    image: dk04-archive:1
    entrypoint: ["python3", "-B", "/app/archive.py", "catalog"]
    environment:
      PGHOST: db
      PGUSER: archivist
      PGPASSWORD: training-archive
      PGDATABASE: archive
      ARCHIVE_TITLE: "The Common Archive"
    ports:
      - "8090:8080"
    depends_on:
      importer:
        condition: service_completed_successfully
  welcome:
    image: dk04-archive:1
    entrypoint: ["python3", "-B", "/app/archive.py", "notes"]
    environment:
      ARCHIVE_TITLE: "The Common Archive"
    ports:
      - "8091:8080"
volumes:
  data:
    labels:
      labex.course: dk04
COMPOSE

Analysez la configuration avant de changer les ressources d’exécution :

docker compose -p archive config

Si le YAML échoue, lisez la ligne signalée, restaurez le bloc affiché avec des espaces et analysez de nouveau. Ne redémarrez pas sans cesse un fichier mal formé.

Testez maintenant un premier démarrage avec un stockage de données du cours vide. Cela supprime délibérément uniquement votre base pédagogique jetable, pas le CSV source ni l’archive de référence. Examinez d’abord les étiquettes réelles du volume :

docker volume inspect archive_data --format '{{json .Labels}}'

Confirmez que com.docker.compose.project vaut archive et que labex.course vaut dk04. Si l’une diffère, arrêtez-vous et examinez le projet plutôt que de supprimer une autre ressource. down --volumes supprime uniquement les conteneurs, le réseau et le volume de données déclaré de ce projet Compose nommé :

docker compose -p archive down --volumes

up -d démarre les services en arrière-plan. --pull never utilise les images préparées ; --no-build empêche de les remplacer par de nouvelles constructions :

docker compose -p archive up -d --pull never --no-build
docker compose -p archive ps -a
docker compose -p archive logs importer

Vous devez obtenir une base saine, un importateur Exited 0 ainsi qu’un catalogue et une page d’accueil à l’état Running. Le délai de premier démarrage et celui d’importation fournis sont explicitement pédagogiques. Aucune attente fixe dans votre fichier Compose ne remplace la disponibilité réelle ou la réussite de l’importation. Si un essai précédent a laissé des conteneurs en échec, examinez leurs journaux, corrigez la configuration, vérifiez les étiquettes du volume du cours et répétez ce démarrage avec données neuves limité au périmètre du cours.

Utiliser le catalogue complet

Passez à Your Archive et rechargez. Recherchez Market morning : deux fiches doivent apparaître avec des identifiants, années, catégories et histoires différents. Ouvrez chacune et utilisez Download transcript, en revenant avec Back to collection. Recherchez Ferry, ouvrez Ferry voices et téléchargez sa transcription. Effacez la recherche pour afficher les quatre fiches. Examinez aussi The shared garden et son téléchargement. Une URL de fiche inconnue doit afficher Record not found, à distinguer d’un échec de connexion ou d’un catalogue indisponible.

Passez à Collection Notes : sa page d’accueil indépendante doit rester disponible. Reference Archive doit toujours proposer la collection complète d’origine. Laissez votre archive finale active. Les vérifications observent d’abord votre base réelle, l’importation terminée et les résultats métier complets. Elles exécutent ensuite vos choix de santé et de dépendances inchangés dans de nouveaux stockages de données distincts et jetables, avec des délais pédagogiques annoncés différents et un échantillon d’importation invalide. Ces dispositifs n’initialisent ni ne réparent jamais votre archive réelle. Un test isolé distinct exécute aussi votre commande de santé inchangée sans aucun serveur de base ; elle doit refuser ce point de connexion indisponible.

Résumé

Vous avez distingué le démarrage du conteneur de base de données de sa disponibilité TCP finale, configuré un véritable contrôle de santé et imposé à l’importateur de l’attendre. Un nouveau stockage de données a ensuite reçu le catalogue complet avant l’ouverture de son consommateur, tandis que la page de notes indépendante restait disponible.