Den Katalog nach dem Import öffnen

DockerBeginner
Jetzt üben

Einführung

The Riverside Archive kann sich mit PostgreSQL verbinden, aber seine Katalogwebsite startet vor Ende des einmaligen Imports. Ergänze die fehlende fachliche Abhängigkeit: Der Katalog darf erst nach erfolgreichem Import öffnen und muss bei ungültiger Eingabe ungestartet bleiben.

Schließe zuerst Wait for the Archive Database ab oder kenne dessen YAML, Gesundheitsprüfungen, Compose-Projekte, Logs und begrenzten Neustart mit frischen Daten. SQL oder Anwendungsprogrammierung sind nicht erforderlich. Dieses Lab bereitet eine unabhängige Datenbank, Quelldaten und Referenz vor; Dateien aus vorherigen VMs werden nicht benötigt. Die bereitgestellte Ausgangsdatenbank hat bereits die richtige Gesundheitsprüfung für den endgültigen TCP-Dienst.

Nutze Workstation, Reference Archive, Your Archive und Collection Notes. Die Datensätze sind synthetisch. Offengelegte Verzögerungen machen Trainingszustände sichtbar; tatsächliche Bereitschaft und Import-Exit-Status bestimmen das Ergebnis. Plane etwa 45 Minuten einschließlich Lesen und gewöhnlicher Fehler ein; dies ist eine Schätzung des Autors.

Erst nach erfolgreichem Import öffnen

In diesem Schritt machst du den Katalog von einem abgeschlossenen Import abhängig, beweist, dass ein echter Fehler ihn blockiert, und stellst den Betrieb mit der ursprünglichen Eingabe wieder her.

Datenbankbereitschaft und fachliche Bereitschaft vergleichen

Beginne in Reference Archive. Suche Market morning, öffne beide passenden Datensätze und lade ihre unterschiedlichen Transkripte herunter. Kehre mit Back to collection zurück und untersuche Ferry voices. Your Archive ist nicht verfügbar, während Collection Notes die Sammlung bereits erklären kann, ohne importierte Zeilen zu lesen.

Wechsle zu Workstation, das in /home/labex/project/archive-opening startet:

cd /home/labex/project/archive-opening
cat compose.yaml
docker compose -p archive ps -a
docker compose -p archive logs importer catalog

Die Datenbank wird gesund und der Importer beendet seine echte Arbeit. Aber der Katalog versuchte zu früh, die Tabelle zu lesen, und endete mit einem Fehler wie relation "entries" does not exist. Eine Datenbank, die Verbindungen annimmt, bedeutet nicht, dass Anwendungsdaten existieren. Die Website hat absichtlich keine versteckte Startwiederholung; die Abhängigkeit muss diese Anforderung ausdrücken.

Diese Umgebung nutzt dieselben vier Rollen und Portbeziehungen wie das vorherige Guided Lab. db hat bereits eine TCP-Gesundheitsprüfung, und importer wartet auf service_healthy. Das verbleibende Problem ist catalog.depends_on.importer.condition: service_started. Es erlaubt den Katalogstart, sobald der Importprozess beginnt, obwohl seine offengelegte sechssekündige Trainingsverzögerung und die echte Transaktion noch bevorstehen.

Den tatsächlichen Verbraucher absichern

Ersetze diese Bedingung durch service_completed_successfully. Dies prüft erfolgreichen Abschluss, nicht nur das Prozessende: Ein Importstatus ungleich null muss den Katalog blockieren. Ein einmaliger Importer mit Exited 0 ist korrekt und sollte weder Running gehalten werden noch eine endlose Neustartregel erhalten. Halte welcome unabhängig, weil seine statischen Sammlungsnotizen keine importierte Tabelle benötigen.

Das vollständige wörtliche Here-Dokument erhält alle bereitgestellten Einstellungen und die vorhandene Datenbank-Gesundheitsprüfung. Wie im vorherigen Lab ersetzt > ausschließlich compose.yaml; die in Anführungszeichen stehende Markierung erhält den Inhalt wörtlich:

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 Riverside 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 Riverside Archive"
    ports:
      - "8091:8080"
volumes:
  data:
    labels:
      labex.course: dk04
COMPOSE
docker compose -p archive config

Schlägt die Verarbeitung fehl, korrigiere die gemeldete Einrückung anhand des gezeigten Blocks, bevor du Dienste startest. Lasse bereitgestellte Anwendung, Importer, CSV, Authentifizierung und Ports unverändert.

Beweisen, dass ein fehlgeschlagener Import den Katalog nicht öffnen kann

compose.bad.yaml ist eine bereitgestellte Überlagerung, die den Importer auf eine getrennte ungültige CSV verweist. Ihre Datensatz-ID enthält Text, wo die echte PostgreSQL-Tabelle eine Ganzzahl verlangt. Der Importer nutzt eine echte Transaktion und gibt den Datenbankstatus ungleich null weiter; er täuscht keinen Erfolg vor. Das ursprüngliche gültige Szenario bleibt erhalten.

Untersuche zuerst das Lern-Volume und bestätige die Projekt-/Kurs-Labels wie zuvor gelernt:

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

Erwarte com.docker.compose.project: archive und labex.course: dk04. Der nächste Befehl entfernt absichtlich ausschließlich die entbehrlichen Trainingsdaten dieses Projekts, damit der Test mit fehlerhafter Eingabe keine zuvor importierte Tabelle nutzen kann:

docker compose -p archive down --volumes

Zwei -f-Argumente führen normale Konfiguration und bereitgestellte Überlagerung in dieser Reihenfolge zusammen. Der nächste Start soll ausdrücklich mit nativem Status 1 fehlschlagen, weil der Importer mit einem Status ungleich null endet:

docker compose -f compose.yaml -f compose.bad.yaml -p archive up -d --pull never --no-build
docker compose -f compose.yaml -f compose.bad.yaml -p archive ps -a
docker compose -f compose.yaml -f compose.bad.yaml -p archive logs importer

Lies den Fehler zur ungültigen Ganzzahl. Die Datenbank kann gesund bleiben, der Importer ist Exited mit einem Code ungleich null, und der Katalog sollte Created, also nie gestartet sein. Der Begrüßungsdienst läuft weiter. Ein Katalog, der startet und dann abstürzt, ist ein anderes Ergebnis: Ihm wurde erlaubt, einen fehlgeschlagenen Import zu nutzen.

Wechsle zu Your Archive und lade neu: Es sollte kein Katalog verfügbar sein. Wechsle zu Collection Notes: Seine unabhängige Seite funktioniert weiterhin. Dies sind echte Dienstzustände, keine inszenierte Erfolgsanzeige.

Mit gültiger Eingabe wiederherstellen und die Datensätze nutzen

Wechsle zu Workstation. Prüfe vor dem Aufräumen erneut dieselben Kurs-Volume-Labels:

docker volume inspect archive_data --format '{{json .Labels}}'
docker compose -f compose.yaml -f compose.bad.yaml -p archive down --volumes

Starte ohne Überlagerung, um zur ursprünglichen gültigen Eingabe zurückzukehren. Dieser neue Datenspeicher muss von Grund auf importieren:

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

Erwarte die Datenbank Healthy, den Importer Exited 0 und beide Webrollen Running. Bei einem gewöhnlichen fehlenden Pfad oder YAML-Fehler kehre ins angegebene Arbeitsverzeichnis zurück, lies compose config oder das Dienst-Log, korrigiere die bearbeitbare Konfiguration und wiederhole nur den begrenzten Neustart dieses Kurses. Bearbeite keine Quellzeilen, unterdrücke keine Fehler und setze die VM nicht zurück, um das Problem zu verbergen.

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.

Der fertige Katalog erhält alle vier Identitäten, einschließlich der beiden unterschiedlichen Market morning-Datensätze:

Der importierte Katalog nach erfolgreichem Kaltstart

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 eine nutzbare Datenbank von einem erfolgreich erzeugten Katalog getrennt. Der Verbraucher wartet nun auf Importer-Exit-Status 0, bleibt nach einem echten Importfehler ungestartet und öffnet nach Wiederherstellung der gültigen Eingabe einen vollständigen neuen Katalog. Die unabhängige Begrüßungsseite bleibt dabei durchgehend nutzbar.