現在の印刷ジョブを終える

DockerBeginner
オンラインで実践に進む

はじめに

Paper & Pine は、停止前に 12 ページの地域向けプログラムを完成させる必要があります。entry は SIGTERM を正しく届けますが、Compose の 1 秒の猶予が、実際の PDF の完成前にワーカーを打ち切ります。次のジョブを開始せずに、余裕のある有限で再利用可能な猶予を設定してください。

先に Deliver the Stop Signal を完了するか、起動用シェル、PID 1、TERM/KILL の違い、ジョブの観察、基本的な Compose コマンドを理解している必要があります。この独立した実験は独自のプログラム、以前の PDF、練習キュー、配布キューを準備します。前の VM のファイル、Python プログラミング、実物のプリンターは不要です。

Workstation と Print Desk を使います。最初のページでの一時停止と残りのページの 0.5 秒の速度制限は、明示された学習用の挙動です。停止猶予はワーカーが一時停止に入った時点ではなく、停止要求から始まります。読む時間とよくある間違いへの対処を含め、約 45 分を見込んでください。作者による見積もりです。

現在のプログラムを終える時間を与える

このステップでは、シグナルの到達成功と完了時間の十分さを区別し、有限の Compose 猶予の中で元の配布ジョブを完成させます。

作業と現在の時間枠を確認する

Print Desk から始めます。Delivery attempt で完成済みの Morning welcome handout をプレビューしてダウンロードします。現在の Community open day programme には実際の PDF 12 ページが必要です。Volunteer notes は後のジョブで、保留のままにする必要があります。練習と配布は、別々のファイルを持つ独立した学習キューです。

Workstation に切り替え、/home/labex/project/print-grace から始めます。

cd /home/labex/project/print-grace
cat entry.sh
cat compose.yaml

entry はすでに exec python3 -B /app/worker.py を使うため、提供ワーカーがシェルを置き換えて Docker の TERM 要求を受け取ります。問題は stop_grace_period: 1s です。学習用一時停止が終わった後、残りの 11 区間それぞれの 0.5 秒と PDF の最終処理には、これ以上の時間がかかります。停止要求前に長く待っても猶予は増えません。ワーカーは意図的に TERM を待ってから残りの仕事を終えます。

準備済みイメージ、ユーザー ID、マウント、入力プログラム、その他の Compose 設定は保ちます。変更するのは有限の停止時間枠だけです。無制限の待機は目的ではありません。

実際に途中で切られる練習を確認する

提供された練習プロジェクトを起動します。

docker compose -f compose.trial.yaml -p print-trial up -d --pull never --no-build

Print Desk に切り替えて再読み込みし、Practice attempt が最初のページの学習用一時停止を示すまで待ちます。Workstation に戻り、1 秒の停止を要求します。

docker compose -f compose.trial.yaml -p print-trial stop worker
docker inspect print-trial --format '{{.State.ExitCode}}'
docker logs print-trial

Docker の停止操作は 0 を返しても、ワーカーの終了コードは 137 になり得ます。前の実験の誤ったシェルによる失敗と異なり、このログには stop-received があり、残りのページイベントも一部あるかもしれませんが、完全な 12 ページ PDF と正常完了はありません。シグナルは届きましたが、実際の残り作業中に猶予が切れました。

Print Desk に切り替えて再読み込みします。練習には完成した現在のプログラムのダウンロードがありません。以前の PDF と未変更の配布キューは維持されています。2 つ目の処理プロセスで不足結果を埋めないでください。

配布開始前に有限の Compose 上書きを保存する

Workstation に切り替えます。小さな上書きファイルなら、提供された基本ファイルを保ち、停止時間枠だけを変えられます。2 つの -f 引数は順にファイルを組み合わせ、後の services.worker.stop_grace_period がその 1 プロパティを上書きします。構成の調査、起動、停止で同じ組を使います。

30 秒以下の、秒単位の整数の有限な猶予を選びます。15 秒なら、この明示された学習用プログラムの残りページと通常のスケジューリングの遅れに余裕があります。これは実用的な余白であり、あらゆる本番 PDF がその時間内に終わるという主張ではありません。

最初のガイド付き実験で学んだリテラルのヒアドキュメントで compose.stop.yaml を保存します。

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

有効な構成の stop_grace_period: 15s を見つけます。準備済みイメージ、数値ユーザー、entry スクリプト、読み取り専用入力は同じです。YAML のインデントが違えば、小さなブロックを修正し、起動前に再解析します。ファイルの変更は作成済みコンテナーの既定値を書き換えないため、配布開始前にこの時間枠を保存してください。

同じファイルの組で配布を起動します。

docker compose -f compose.yaml -f compose.stop.yaml -p print-delivery up -d --pull never --no-build

Print Desk に切り替えて再読み込みし、Delivery attempt が学習用一時停止を示すまで待ちます。次に Workstation に切り替え、同じ有効な構成で停止します。

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

ワーカーは stop-received、全 12 ページのイベント、現在のジョブの completed、worker-stopped の後に 0 で終了するはずです。要求を受け取ってプログラムを終えるまで、実行とプロセスの識別は同じままです。この停止済みコンテナーを保持し、片付けの近道として削除しないでください。

完全な PDF を使い、ほかの作業を保つ

Print Desk に切り替え、再読み込みし、Delivery attempt の現在のプログラムの Preview text を選びます。実際に保存された PDF をデコードします。最初と最後のページ、その間のすべてのセクション見出しとページ番号を調べます。プログラムをダウンロードし、12 ページを開いてください。desk に戻り、朝の資料が未変更で、Volunteer notes が PDF なしの保留状態であることを確認します。

配布には、正常停止したワーカーと実際の 12 ページのダウンロードがあります。練習は目に見える失敗状態のまま、後のジョブは保留です。

完全なプログラムの処理を終えた後の Print Desk

チェックは実際の Docker TERM/終了の事実、元のワーカーの識別、実際にデコードしたページ内容、キューの維持を結び付けます。使い捨ての再実行では、別のプログラムで保存 entry と有効な有限猶予をテストします。実際のワーカーにシグナルを送ったり修復したりはしません。

失敗した配布から回復する

配布の試行が失敗したら、ログと終了ステータスを読むまで停止コンテナーを保持します。entry または猶予の構成だけを修正します。提供の回復操作は実行中または成功済みのコンテナーを拒否します。失敗して停止したコース用ワーカーに対してだけ、現在のジョブを再びキューに入れ、失敗した成果物を delivery/attempt-history/ に保ちます。以前の PDF、元の入力、次の保留ジョブは維持します。

python3 /opt/labex/dk05/source/retry.py

この明示的な回復後に docker compose -p print-delivery down で失敗した配布プロジェクトのコンテナーだけを削除し、表示した配布起動、一時停止の待機、停止の手順を繰り返します。元の PDF は再生成されず、この回復がタブや採点チェックから実行されることもありません。失敗を隠すために VM をリセットしたりキュー JSON を変更したりしないでください。

まとめ

停止要求が届くことと、ジョブの残りを終える時間が十分にあることを区別しました。保存した有限の Compose 猶予により、元のワーカーは PDF 全 12 ページを完成して正常終了し、以前の出力と後の保留ジョブをともに維持しました。