Auf die Archivdatenbank warten

DockerBeginner
Jetzt üben

Einführung

The Common Archive speichert vier Nachbarschaftsdatensätze in PostgreSQL. Seine Referenzwebsite funktioniert, aber das neue Archiv versuchte, seinen Katalog zu importieren, bevor die Datenbank Verbindungen annehmen konnte. Mache den ersten Start zuverlässig, indem du einen laufenden Container von einer nutzbaren Datenbank unterscheidest.

Du solltest grundlegendes Docker, Container-Logs, freigegebene Ports und Terminalpfade kennen. Dieses Lab erklärt YAML-Beziehungen, die kleine Compose-Datei, eine Datenbank-Gesundheitsprüfung und Abhängigkeitsbedingungen. SQL, PostgreSQL-Administration oder Anwendungsprogrammierung sind nicht erforderlich. Das vollständige Datenbank-Image, Importer, Website und Daten sind bereitgestellt.

Nutze Workstation, Reference Archive, Your Archive und Collection Notes. Alle Materialien sind synthetische Unterrichtsdatensätze. Absichtliche Datenbank- und Importverzögerungen machen Startzustände sichtbar; sie sind keine Aussagen über Produktionszeiten. Plane etwa 45 Minuten einschließlich Lesen und gewöhnlicher Fehler ein; dies ist eine Schätzung des Autors.

Auf eine nutzbare Datenbank warten

In diesem Schritt reparierst du eine Abhängigkeit in einer kleinen, vollständigen Anwendung. Arbeite die Beobachtungen durch, bevor du die Konfiguration ersetzt.

Das normale Archiv nutzen

Beginne in Reference Archive. Suche mit Search the collection und Search nach Market morning. Zwei Datensätze teilen diesen Titel, stehen aber für unterschiedliche Geschichten. Öffne beide, untersuche ihre IDs, Jahre und Kategorien und nutze Download transcript. Kehre mit Back to collection zurück, leere die Suche und untersuche Ferry voices. Downloads sind echter Text aus den Datenbankdatensätzen, keine Abschlussmarkierungen.

Wechsle zu Your Archive. Es erklärt, dass der Katalog nicht läuft; es übernimmt nicht die Referenz. Collection Notes funktioniert bereits, weil dieser Begrüßungsdienst keine Datenbankzeilen liest. Ein Container mit Status Up beweist nicht, dass der Katalog vollständig ist.

Den tatsächlichen fehlgeschlagenen Start lesen

Die Referenzsammlung enthält vier Datensätze; beide Market morning-Einträge haben eigene Identitäten:

Der vollständige Referenzkatalog

Wechsle zu Workstation, das in /home/labex/project/archive-startup startet. cd führt bei Bedarf in diesen Ordner zurück. cat zeigt Dateien an:

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

Compose liest YAML. Einrückung gruppiert die Eigenschaften jedes Dienstes; nutze Leerzeichen, keine Tabs. Die vier Einträge unter services: sind:

Dienst Tatsächliche Aufgabe Erfolgreicher Zustand
db PostgreSQL speichert die Datensätze Läuft und nimmt TCP-Verbindungen an
importer Eine einzelne Transaktion importiert die bereitgestellte CSV Mit Status 0 beendet
catalog Sucht und liefert Datensätze und Transkripte Läuft nach erfolgreichem Import
welcome Liefert Collection Notes ohne Datenbankzugriff Darf vor dem Import laufen

image wählt ein vorbereitetes Image. entrypoint startet ein bereitgestelltes Programm; du bearbeitest es nicht. environment übergibt diesem Programm benannte Einstellungen. PGHOST, PGUSER, PGPASSWORD und PGDATABASE teilen den Clients mit, welche Datenbank und welches Trainingskonto sie verwenden sollen. Diese begrenzten Zugangsdaten werden für dieses Lab bereitgestellt. POSTGRES_* bereitet dieses Konto in einem neuen Datenspeicher vor. Ändere keine Authentifizierung und ersetze die Datenbank nicht.

Das Volume data erhält die Datenbankdateien dieses Projekts. Relatives ./scenario bindet den bereitgestellten Eingabeordner schreibgeschützt in den Importer ein, erkennbar an :ro. Die Datenbank liest außerdem ihr bereitgestelltes Skript zur Trainingsverzögerung beim ersten Start. Die Portfreigabe 8090:8080 verbindet Your Archive mit dem Katalog. Die Begrüßungsseite nutzt einen separaten Port. Ein Compose-Projekt gruppiert Ressourcen; -p archive adressiert unten immer dein Lernarchiv, während die Referenz ein anderes Projekt und Volume nutzt.

ps -a schließt gestoppte und nie gestartete Container ein. logs liest ihre tatsächliche Ausgabe:

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

Die Datenbank meldet schließlich Bereitschaft, aber die Verbindung des Importers ist bereits fehlgeschlagen. Eine später bereite Datenbank wiederholt einen fehlgeschlagenen Import nicht automatisch. Der Katalog bleibt ungestartet, weil seine bereitgestellte Abhängigkeit bereits auf erfolgreichen Import wartet.

PostgreSQL nutzt kurz einen temporären Initialisierungsserver, bevor es seinen endgültigen TCP-Listener startet. Eine Prüfung nur seines lokalen Unix-Sockets kann für einen anderen Container zu früh bereit werden. pg_isready meldet, ob ein Server Verbindungen annimmt; es beweist nicht, dass Zugangsdaten oder Kataloginhalte korrekt sind.

Die folgende schreibgeschützte Probe nutzt absichtlich den falschen TCP-Port. exec führt sie in db aus, -T deaktiviert Terminalzuweisung, -h wählt die Adresse, -p den Port und -U/-d nennen den bereitgestellten Benutzer bzw. die Datenbank. Auf Port 6543 läuft kein Server, erwarte daher no response und nativen Exit-Status 2:

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

Dies ist ein Probenfehler, kein Verlust von Katalogdaten. Die endgültige Datenbank lauscht auf ihrem normalen TCP-Port 5432. Eine Gesundheitsprüfung muss diesen tatsächlichen Dienst adressieren.

Bereitschaft ausdrücken und mit neuen Daten starten

Lasse Anwendungseinstellungen und bereitgestellte Dateien unverändert. Ergänze einen echten healthcheck bei db und ändere die Datenbankbedingung des Importers von service_started zu service_healthy. test ist der Befehl, den Docker im Datenbankcontainer ausführt. Das JSON-ähnliche Array nutzt CMD, um das benannte Programm ohne Shell direkt auszuführen. -h 127.0.0.1 wählt den endgültigen TCP-Listener; Standardport ist 5432. interval: 1s, timeout: 2s und retries: 40 ermöglichen wiederholte begrenzte Proben statt einer festen Wartezeit, die Datenbankbereitschaft nur vortäuscht.

Die Bedingung service_completed_successfully des Katalogs bleibt erhalten: Ein erfolgreicher einmaliger Import endet mit 0 und muss nicht Running bleiben. Sein Fehlschlag muss den Katalog blockieren. Die Begrüßungsseite hat keine Importabhängigkeit, weil sie keine importierten Daten benötigt.

Das folgende wörtliche Here-Dokument schreibt die vollständige Konfiguration für reproduzierbare Einrückung. cat liefert die Zeilen, > ersetzt ausschließlich compose.yaml, und die in Anführungszeichen stehende Markierung COMPOSE verhindert Shell-Ersetzungen bis zur Schlusszeile. Alle anderen Anwendungseinstellungen bleiben erhalten:

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

Prüfe die Konfiguration vor Änderungen an Laufzeitressourcen:

docker compose -p archive config

Falls YAML fehlschlägt, lies die gemeldete Zeile, stelle den gezeigten Block mit Leerzeichen wieder her und prüfe erneut. Starte eine fehlerhafte Datei nicht wiederholt neu.

Teste nun einen ersten Start mit leerem Kursdatenspeicher. Dies löscht absichtlich nur deine entbehrliche Trainingsdatenbank, nicht die Quell-CSV oder das Referenzarchiv. Untersuche zuerst die tatsächlichen Volume-Labels:

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

Bestätige com.docker.compose.project als archive und labex.course als dk04. Weicht eines ab, halte an und untersuche das Projekt, statt eine andere Ressource zu löschen. down --volumes entfernt nur Container, Netzwerk und deklariertes Daten-Volume dieses benannten Compose-Projekts:

docker compose -p archive down --volumes

up -d startet Dienste im Hintergrund. --pull never verwendet die vorbereiteten Images; --no-build verhindert, sie durch neue Builds zu ersetzen:

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

Erwarte eine gesunde Datenbank, einen Importer mit Exited 0 sowie Katalog und Begrüßungsseite mit Running. Die bereitgestellten Verzögerungen beim ersten Start und Import dienen ausdrücklich dem Training. Kein festes Sleep in deiner Compose-Datei ersetzt tatsächliche Bereitschaft oder erfolgreichen Import. Hat ein früherer Versuch fehlgeschlagene Container hinterlassen, untersuche ihre Logs, korrigiere die Konfiguration, prüfe die Kurs-Volume-Labels und wiederhole diesen begrenzten Start mit neuen Daten.

Den fertigen Katalog nutzen

Wechsle zu Your Archive und lade neu. Suche nach Market morning: Zwei Datensätze mit unterschiedlichen IDs, Jahren, Kategorien und Geschichten sollten erscheinen. Öffne jeden und nutze Download transcript; kehre jeweils mit Back to collection zurück. Suche nach Ferry, öffne Ferry voices und lade sein Transkript herunter. Leere die Suche, um alle vier Datensätze anzuzeigen. Untersuche auch The shared garden und seinen Download. Eine unbekannte Datensatz-URL sollte Record not found anzeigen, was sich von einem Verbindungsfehler oder nicht verfügbarem Katalog unterscheidet.

Wechsle zu Collection Notes: Die unabhängige Begrüßungsseite muss verfügbar bleiben. Reference Archive sollte weiterhin die ursprüngliche vollständige Sammlung anbieten. Lasse dein endgültiges Archiv laufen. Die Prüfungen beobachten zuerst deine laufende Datenbank, den abgeschlossenen Import und vollständige Geschäftsergebnisse. Anschließend führen sie deine unveränderten Gesundheits- und Abhängigkeitsentscheidungen in getrennten, temporären neuen Datenspeichern mit anderen offengelegten Trainingsverzögerungen und einer ungültigen Importprobe aus. Diese Testumgebungen initialisieren oder reparieren dein laufendes Archiv niemals. Ein separater isolierter Test führt deinen unveränderten Gesundheitsbefehl auch ohne Datenbankserver aus; er muss diesen nicht verfügbaren Endpunkt ablehnen.

Zusammenfassung

Du hast den Start des Datenbankcontainers von der endgültigen TCP-Bereitschaft unterschieden, eine echte Gesundheitsprüfung konfiguriert und den Importer darauf warten lassen. Ein neuer Datenspeicher erhielt daraufhin den vollständigen Katalog, bevor sein Verbraucher öffnete, während die unabhängige Notizenseite verfügbar blieb.