Termine o trabalho de impressão atual

DockerBeginner
Pratique Agora

Introdução

A Paper & Pine agora precisa terminar um programa comunitário de doze páginas antes de parar. Sua entrada já entrega SIGTERM corretamente, mas um período de tolerância de um segundo no Compose interrompe o worker antes que seu PDF real fique completo. Defina um período finito e reutilizável, com margem suficiente, sem iniciar o próximo trabalho.

Conclua primeiro Deliver the Stop Signal ou conheça seu shell de entrada, PID 1, a distinção TERM/KILL, as observações dos trabalhos e os comandos básicos do Compose. Este laboratório independente prepara seu próprio programa de evento, PDF anterior, fila de prática e fila de entrega. Não são necessários arquivos de VMs anteriores, programação em Python nem impressora física.

Use Workstation e Print Desk. A pausa na primeira página e a limitação de 0,5 segundo nas páginas restantes são comportamentos de treinamento informados. O período de tolerância começa com a solicitação de parada, não quando o worker entra na pausa. Reserve cerca de 45 minutos para leitura e erros comuns; essa é uma estimativa do autor.

Dê tempo para o programa atual terminar

Nesta etapa, você distinguirá a entrega bem-sucedida de um sinal de tempo suficiente para conclusão e depois terminará o trabalho original de entrega dentro de um período finito de tolerância do Compose.

Conheça o trabalho e o limite atual

Comece em Print Desk. Em Delivery attempt, visualize e baixe o Morning welcome handout concluído. O Community open day programme atual exige doze páginas PDF reais; Volunteer notes é um trabalho posterior que deve continuar pendente. Prática e entrega são filas de treinamento separadas, com arquivos separados.

Mude para Workstation, que inicia em /home/labex/project/print-grace:

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

A entrada já usa exec python3 -B /app/worker.py, de modo que o worker fornecido substitui o shell e recebe a solicitação TERM do Docker. O problema é stop_grace_period: 1s. Quando a pausa de treinamento termina, os onze intervalos restantes de 0,5 segundo cada, mais a finalização do PDF, precisam de mais tempo. Esperar mais antes de solicitar a parada não aumenta o período de tolerância: o worker aguarda deliberadamente TERM antes de concluir o trabalho.

Mantenha inalterados a imagem preparada, os IDs de usuário, as montagens, o programa de entrada e as outras configurações do Compose. Você ajustará somente o limite finito de parada; uma espera ilimitada não é o resultado desejado.

Veja uma tentativa real de prática truncada

Inicie o projeto de prática fornecido:

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

Mude para Print Desk, recarregue e aguarde Practice attempt mostrar sua pausa de treinamento na primeira página. Volte para Workstation e solicite sua parada de um segundo:

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

A operação de parada do Docker pode retornar 0 enquanto o código de saída do worker é 137. Diferentemente da falha por shell incorreto do laboratório anterior, este log inclui stop-received e pode incluir alguns eventos de páginas restantes, mas nenhum PDF completo de doze páginas nem conclusão normal. A entrega do sinal funcionou; o período de tolerância expirou durante o trabalho real restante.

Mude para Print Desk e recarregue. A prática não tem download do programa atual finalizado. Os PDFs anteriores e a fila de entrega intacta permanecem preservados. Não inicie outro processo de processamento para gerar o PDF que falta: o próprio worker original deve concluí-lo.

Salve uma sobreposição finita do Compose antes de iniciar a entrega

Mude para Workstation. Uma pequena sobreposição permite preservar o arquivo base fornecido e alterar somente o limite de parada. Dois argumentos -f combinam os arquivos na ordem; o services.worker.stop_grace_period posterior sobrescreve essa única propriedade. Use o mesmo par para examinar a configuração, iniciar e parar.

Escolha um período finito de tolerância em segundos inteiros, de no máximo 30 segundos. Quinze segundos dão a este programa de treinamento informado espaço para as páginas restantes e a sobrecarga normal de escalonamento. É uma margem prática, não uma alegação de que todo PDF de produção termina nesse tempo.

Use o here-document literal ensinado no primeiro laboratório guiado para salvar 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

Encontre stop_grace_period: 15s na configuração efetiva. A imagem preparada, o usuário numérico, o script de entrada e a entrada somente de leitura permanecem os mesmos. Se a indentação YAML estiver errada, corrija o pequeno bloco e analise novamente antes de iniciar. Um arquivo alterado não reescreve os padrões de um contêiner já criado; portanto salve esse limite antes de iniciar a entrega.

Inicie a entrega com esse mesmo par de arquivos:

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

Mude para Print Desk, recarregue e aguarde Delivery attempt mostrar a pausa de treinamento. Depois mude para Workstation e use a mesma configuração efetiva para pará-la:

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

O worker deve encerrar com 0 após stop-received, os doze eventos de página, completed do trabalho atual e worker-stopped. Sua identidade de execução e de processo permanece a mesma desde o recebimento da solicitação até o término do programa. Mantenha esse contêiner parado; não o remova como atalho de limpeza.

Use o PDF completo e preserve os outros trabalhos

Mude para Print Desk, recarregue e selecione Preview text do programa atual em Delivery attempt. Ele decodifica o PDF realmente salvo. Examine a primeira e a última página e todos os títulos de seção e números de página intermediários. Baixe o programa e abra suas doze páginas. Volte ao painel e confirme que o folheto da manhã está inalterado e Volunteer notes continua pendente, sem PDF.

A entrega agora tem um worker encerrado normalmente e um download real de doze páginas. A prática permanece visivelmente sem sucesso, enquanto o trabalho posterior está pendente:

Print Desk após a conclusão completa do programa antes da parada

As verificações combinam fatos reais de TERM/saída do Docker, a identidade do worker original, o conteúdo real das páginas decodificadas e a preservação da fila. Uma reprodução descartável testa a entrada salva e o período finito de tolerância efetivo em outro programa. Ela não envia sinais nem repara seu worker real.

Recupere uma entrega sem sucesso

Se sua tentativa de entrega falhar, mantenha o contêiner parado por tempo suficiente para ler seus logs e status de saída. Corrija somente a configuração de entrada ou do período de tolerância. A ação de recuperação fornecida recusa um contêiner em execução ou concluído com sucesso; para um worker parado do curso sem sucesso, ela recoloca apenas o trabalho atual na fila e mantém os artefatos com falha em delivery/attempt-history/. Ela preserva o PDF anterior, as entradas originais e o trabalho posterior pendente:

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

Após essa recuperação explícita, remova somente os contêineres do projeto de entrega com falha usando docker compose -p print-delivery down e repita a sequência mostrada de início da entrega, espera pela pausa e parada. Nenhum PDF de origem é regenerado, e essa recuperação nunca é executada por uma aba ou verificação de pontuação. Não redefina a VM nem altere o JSON da fila para esconder uma tentativa com falha.

Resumo

Você distinguiu o recebimento de uma solicitação de parada de tempo suficiente para concluir um trabalho. Um período finito de tolerância salvo no Compose permitiu que o worker original terminasse as doze páginas PDF, encerrasse normalmente e preservasse tanto a saída anterior quanto o trabalho posterior pendente.