Einführung
Paper & Pine muss nun vor dem Stoppen ein zwölfseitiges Gemeinschaftsprogramm fertigstellen. Sein Einstieg übermittelt SIGTERM bereits korrekt, aber die einsekündige Compose-Frist beendet den Worker, bevor sein echtes PDF vollständig ist. Lege eine begrenzte, wiederverwendbare Frist mit genügend Reserve fest, ohne den nächsten Auftrag zu starten.
Schließe zuerst Deliver the Stop Signal ab oder kenne dessen Einstiegsshell, PID 1, TERM/KILL-Unterschied, Auftragsbeobachtungen und grundlegende Compose-Befehle. Dieses unabhängige Lab bereitet sein eigenes Programmheft, früheres PDF, Übungs- und Lieferwarteschlange vor. Vorherige VM-Dateien, Python-Programmierung oder physischer Drucker sind nicht erforderlich.
Nutze Workstation und Print Desk. Die Pause nach der ersten Seite und die Drosselung der übrigen Seiten um 0,5 Sekunden sind offengelegtes Trainingsverhalten. Die Stoppfrist beginnt mit der Stoppanforderung, nicht wenn der Worker erstmals in seine Pause eintritt. Plane etwa 45 Minuten einschließlich Lesen und gewöhnlicher Fehler ein; dies ist eine Schätzung des Autors.
Dem aktuellen Programmheft Zeit zum Fertigstellen geben
In diesem Schritt unterscheidest du erfolgreiche Signalzustellung von ausreichender Fertigstellungszeit und beendest den ursprünglichen Lieferauftrag innerhalb einer begrenzten Compose-Frist.
Die Arbeit und das aktuelle Zeitbudget feststellen
Beginne in Print Desk. Zeige unter Delivery attempt die Vorschau des fertigen Morning welcome handout an und lade es herunter. Das aktuelle Community open day programme benötigt zwölf echte PDF-Seiten; Volunteer notes ist ein späterer Auftrag, der ausstehend bleiben muss. Übung und Lieferung sind getrennte Trainingswarteschlangen mit getrennten Dateien.
Wechsle zu Workstation, das in /home/labex/project/print-grace startet:
cd /home/labex/project/print-grace
cat entry.sh
cat compose.yaml
Der Einstieg nutzt bereits exec python3 -B /app/worker.py, sodass der bereitgestellte Worker die Shell ersetzt und Dockers TERM-Anforderung empfängt. Das Problem ist stop_grace_period: 1s. Nach der Trainingspause benötigen elf verbleibende Intervalle zu je 0,5 Sekunden plus PDF-Fertigstellung mehr Zeit. Länger vor der Stoppanforderung zu warten verlängert die Frist nicht: Der Worker wartet absichtlich auf TERM, bevor er seinen Auftrag abschließt.
Lasse vorbereitetes Image, Benutzer-IDs, Mounts, Eingabeprogramm und andere Compose-Einstellungen unverändert. Du passt nur das begrenzte Stoppbudget an; unbegrenztes Warten ist nicht das gewünschte Ergebnis.
Einen tatsächlich abgebrochenen Übungsversuch sehen
Starte das bereitgestellte Übungsprojekt:
docker compose -f compose.trial.yaml -p print-trial up -d --pull never --no-build
Wechsle zu Print Desk, lade neu und warte, bis Practice attempt seine Trainingspause nach der ersten Seite zeigt. Wechsle zurück zu Workstation und fordere seinen einsekündigen Stopp an:
docker compose -f compose.trial.yaml -p print-trial stop worker
docker inspect print-trial --format '{{.State.ExitCode}}'
docker logs print-trial
Die Docker-Stoppoperation kann 0 zurückgeben, während der Worker-Exit-Code 137 ist. Anders als beim Fehler mit falscher Shell im vorherigen Lab enthält dieses Log stop-received und möglicherweise einige weitere Seitenereignisse, aber kein vollständiges zwölfseitiges PDF und keinen normalen Abschluss. Die Signalzustellung funktionierte; die Frist lief während der tatsächlich verbleibenden Arbeit ab.
Wechsle zu Print Desk und lade neu. Die Übung hat keinen fertigen aktuellen Programm-Download. Frühere PDFs und unberührte Lieferwarteschlange bleiben erhalten. Ergänze das fehlende Ergebnis nicht mit einem zweiten Verarbeiter.
Vor dem Lieferstart eine begrenzte Compose-Überlagerung speichern
Wechsle zu Workstation. Eine kleine Überlagerung lässt dich die bereitgestellte Basisdatei erhalten und nur das Stoppbudget ändern. Zwei -f-Argumente kombinieren die Dateien der Reihe nach; das spätere services.worker.stop_grace_period überschreibt diese eine Eigenschaft. Nutze dasselbe Paar für Konfigurationsprüfung, Start und Stopp.
Wähle eine begrenzte Frist in ganzen Sekunden von höchstens 30 Sekunden. Fünfzehn Sekunden geben diesem offengelegten Trainingsprogramm Raum für verbleibende Seiten und gewöhnlichen Scheduling-Aufwand. Dies ist eine praktische Reserve, keine Behauptung, dass jedes Produktions-PDF in dieser Zeit fertig wird.
Speichere compose.stop.yaml mit dem im ersten Guided Lab gelernten wörtlichen Here-Dokument:
cat > compose.stop.yaml <<'COMPOSE'
services:
worker:
stop_grace_period: 15s
COMPOSE
docker compose -f compose.yaml -f compose.stop.yaml -p print-delivery config
Suche stop_grace_period: 15s in der wirksamen Konfiguration. Vorbereitetes Image, numerischer Benutzer, Einstiegsskript und schreibgeschützte Eingabe bleiben gleich. Ist die YAML-Einrückung falsch, korrigiere den kleinen Block und prüfe vor dem Start erneut. Eine geänderte Datei schreibt die Standardwerte eines bereits erstellten Containers nicht um; speichere dieses Budget daher vor Lieferstart.
Starte die Lieferung mit demselben Dateipaar:
docker compose -f compose.yaml -f compose.stop.yaml -p print-delivery up -d --pull never --no-build
Wechsle zu Print Desk, lade neu und warte auf die Trainingspause unter Delivery attempt. Wechsle dann zu Workstation und nutze dieselbe wirksame Konfiguration zum Stoppen:
docker compose -f compose.yaml -f compose.stop.yaml -p print-delivery stop worker
docker inspect print-delivery --format '{{.State.ExitCode}}'
docker logs print-delivery
Der Worker sollte nach stop-received, allen zwölf Seitenereignissen, completed des aktuellen Auftrags und worker-stopped mit 0 enden. Seine Lauf- und Prozessidentität bleibt vom Empfang der Anforderung bis zur Fertigstellung des Programms gleich. Behalte diesen gestoppten Container; entferne ihn nicht als Aufräumabkürzung.
Das vollständige PDF nutzen und andere Arbeit erhalten
Wechsle zu Print Desk, lade neu und wähle Preview text des aktuellen Programms unter Delivery attempt. Es dekodiert das tatsächliche gespeicherte PDF. Prüfe erste und letzte Seite sowie alle dazwischenliegenden Abschnittsüberschriften und Seitennummern. Lade das Programmheft herunter und öffne seine zwölf Seiten. Kehre zum Schalter zurück und bestätige, dass das Morgen-Handout unverändert und Volunteer notes weiterhin ohne PDF ausstehend ist.
Die Lieferung hat nun einen normal gestoppten Worker und einen echten zwölfseitigen Download. Die Übung bleibt sichtbar erfolglos, während der spätere Auftrag ausstehend ist:

Die Prüfungen verbinden echte Docker-TERM-/Exit-Fakten, die Identität des ursprünglichen Workers, tatsächlich dekodierte Seiteninhalte und Warteschlangenerhalt. Eine temporäre Wiederholung testet gespeicherten Einstieg und wirksame begrenzte Frist mit einem anderen Programmheft. Sie signalisiert oder repariert deinen tatsächlichen Worker nicht.
Einen erfolglosen Lieferversuch wiederherstellen
Wenn dein Lieferversuch fehlschlägt, behalte den gestoppten Container lange genug, um Logs und Exit-Status zu lesen. Korrigiere nur Einstiegs- oder Fristkonfiguration. Die bereitgestellte Wiederherstellungsaktion verweigert einen laufenden oder erfolgreich beendeten Container; bei einem erfolglosen gestoppten Kurs-Worker stellt sie nur den aktuellen Auftrag zurück in die Warteschlange und bewahrt fehlgeschlagene Artefakte in delivery/attempt-history/ auf. Sie erhält das frühere PDF, Originaleingaben und den späteren ausstehenden Auftrag:
python3 /opt/labex/dk05/source/retry.py
Entferne nach dieser expliziten Wiederherstellung nur die Container des fehlgeschlagenen Lieferprojekts mit docker compose -p print-delivery down und wiederhole die gezeigte Folge aus Lieferstart, Warten auf die Pause und Stopp. Kein Quell-PDF wird neu erzeugt, und diese Wiederherstellung wird niemals durch einen Tab oder eine Bewertung ausgeführt. Setze die VM nicht zurück und ändere kein Warteschlangen-JSON, um einen fehlgeschlagenen Versuch zu verbergen.
Zusammenfassung
Du hast eine empfangene Stoppanforderung von genügend Zeit zum Fertigstellen eines Auftrags unterschieden. Eine gespeicherte, begrenzte Compose-Frist ließ den ursprünglichen Worker alle zwölf PDF-Seiten fertigstellen, normal enden und sowohl frühere Ausgabe als auch den späteren ausstehenden Auftrag erhalten.



