현재 인쇄 작업 마치기

DockerBeginner
지금 연습하기

소개

Paper & Pine는 이제 중지 전에 12페이지 지역 행사 프로그램을 완성해야 합니다. 진입 스크립트는 이미 SIGTERM을 올바르게 전달하지만 Compose의 1초 유예가 실제 PDF를 완성하기 전에 worker를 끊어 버립니다. 다음 작업을 시작하지 않으면서 충분한 여유를 가진 유한하고 재사용 가능한 유예 시간을 설정하세요.

먼저 Deliver the Stop Signal을 완료하거나 진입 셸, PID 1, TERM/KILL 구분, 작업 관찰, 기본 Compose 명령을 알고 있어야 합니다. 이 독립 실습은 자체 프로그램 문서, 앞선 PDF, 연습 큐, 전달 큐를 준비합니다. 이전 VM 파일, Python 프로그래밍, 실제 프린터는 필요하지 않습니다.

Workstation과 Print Desk를 사용하세요. 첫 페이지 일시 정지와 나머지 페이지의 0.5초 속도 제한은 공개된 교육 동작입니다. 중지 유예는 worker가 처음 일시 정지에 들어갈 때가 아니라 중지를 요청할 때 시작됩니다. 읽기와 일반적인 실수를 포함해 약 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

진입 스크립트는 이미 exec python3 -B /app/worker.py를 사용하므로 제공된 worker가 셸을 교체하고 Docker의 TERM 요청을 받습니다. 문제는 stop_grace_period: 1s입니다. 교육 일시 정지가 끝나면 각각 0.5초인 남은 11개 간격과 PDF 최종 완성에 그보다 긴 시간이 필요합니다. 중지를 요청하기 전에 더 오래 기다려도 유예 시간은 늘어나지 않습니다. worker는 작업을 마치기 전에 의도적으로 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을 반환해도 worker의 종료 코드는 137일 수 있습니다. 앞선 실습의 잘못된 셸 실패와 달리 이 로그에는 stop-received가 있으며 남은 페이지 이벤트 일부도 있을 수 있지만, 완전한 12페이지 PDF와 정상 완료는 없습니다. 신호 전달은 작동했지만 실제 남은 작업 도중에 유예가 만료되었습니다.

Print Desk로 전환하여 새로고침하세요. 연습에는 최종 완성된 현재 프로그램 다운로드가 없습니다. 앞선 PDF와 손대지 않은 전달 큐는 온전히 남습니다. 별도의 처리 프로세스를 새로 실행하여 누락된 결과를 채우지 마세요. 현재 PDF는 중지 요청을 받은 원래 worker가 완성해야 합니다.

전달 시작 전에 유한한 Compose 오버라이드 저장하기

Workstation으로 전환하세요. 작은 오버라이드를 사용하면 제공된 기본 파일을 보존하면서 중지 시간만 바꿀 수 있습니다. 두 -f 인수는 파일을 순서대로 결합하며 뒤의 services.worker.stop_grace_period가 해당 속성 하나를 덮어씁니다. 설정 확인, 시작, 중지에 같은 파일 쌍을 사용하세요.

최대 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를 찾으세요. 준비된 이미지, 숫자 사용자, 진입 스크립트, 읽기 전용 입력은 같습니다. 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

worker는 stop-received, 12페이지 전체의 페이지 이벤트, 현재 작업의 completed, worker-stopped 후 0으로 종료해야 합니다. 요청을 받고 프로그램을 마칠 때까지 실행 및 프로세스 식별값이 같아야 합니다. 이 중지된 컨테이너를 보존하세요. 정리의 지름길로 제거하지 마세요.

전체 PDF 사용 및 다른 작업 보존하기

Print Desk로 전환하여 새로고침하고 Delivery attempt 아래 현재 프로그램의 Preview text를 선택하세요. 실제 저장된 PDF를 디코딩합니다. 첫 페이지와 마지막 페이지, 그 사이의 모든 절 제목과 페이지 번호를 확인하세요. 프로그램을 다운로드하여 12페이지를 여세요. 데스크로 돌아가 아침 유인물이 변경되지 않았고 Volunteer notes가 PDF 없이 여전히 대기 중인지 확인합니다.

이제 전달에는 정상 중지된 worker와 실제 12페이지 다운로드가 있습니다. 연습은 실패한 상태로 보이며 나중 작업은 대기 중입니다.

프로그램 전체를 마친 후의 Print Desk

검사는 실제 Docker TERM/종료 사실, 원래 worker의 식별값, 실제 디코딩된 페이지 내용, 큐 보존을 함께 확인합니다. 일회용 재실행은 다른 프로그램에서 저장된 진입 스크립트와 실효 유한 유예를 테스트합니다. 실제 worker에 신호를 보내거나 수정하지 않습니다.

실패한 전달 복구하기

전달 시도가 실패하면 로그와 종료 상태를 읽을 때까지 중지된 컨테이너를 보존하세요. 진입 또는 유예 설정만 수정합니다. 제공된 복구 작업은 실행 중이거나 성공적으로 완료된 컨테이너를 거부합니다. 실패하여 중지된 과정 worker에는 현재 작업만 다시 대기열에 넣고 실패한 산출물을 delivery/attempt-history/에 보관합니다. 앞선 PDF, 원래 입력, 나중 대기 작업을 보존합니다.

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

명시적으로 복구한 다음 docker compose -p print-delivery down으로 실패한 전달 프로젝트의 컨테이너만 제거하고 표시된 전달 시작, 일시 정지 대기, 중지 순서를 반복하세요. 원본 PDF는 재생성되지 않으며 탭이나 점수 검사에서 이 복구를 실행하는 일은 없습니다. 실패한 시도를 숨기려고 VM을 초기화하거나 큐 JSON을 변경하지 마세요.

요약

중지 요청의 수신과 작업을 마치기에 충분한 시간을 구분했습니다. 저장된 유한 Compose 유예로 원래 worker가 PDF 12페이지를 모두 완성하고 정상 종료했으며, 앞선 출력과 나중 대기 작업을 모두 보존했습니다.