Estou executando vários contêineres docker no meu servidor Ubuntu. Eles são controlados pelo systemd.
Se eu executar systemctl stop [email protected]
o container desliga normalmente. A saída de journalctl é a seguinte (saída em tempo reverso, mais recente no topo):
Nov 05 10:58:11 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:58:11 ubox0 docker[3622]: mw-salcom-app
Nov 05 10:58:09 ubox0 docker[3470]: [Thu Nov 05 10:58:09.921033 2020] [mpm_prefork:notice] [pid 1] AH00169: caught SIGTERM, shutting down
Nov 05 10:58:09 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...
Se eu, no entanto, executar shutdown -h now
, recebo:
Nov 05 10:51:04 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Failed with result 'timeout'.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Main process exited, code=killed, status=9/KILL
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Killing process 2077 (docker) with signal SIGKILL.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: State 'stop-sigterm' timed out. Killing.
Nov 05 10:50:04 ubox0 systemd[1]: [email protected]: Stopping timed out. Terminating.
Nov 05 10:49:04 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...
O contêiner não é interrompido e o processo eventualmente expira após 2 minutos e o contêiner é abortado.
Qual é a razão para isto?
Eu gostaria que meus contêineres fossem desligados normalmente para que os serviços executados neles fossem interrompidos sem perda de dados.
Meu arquivo de serviço é:
[Unit]
Description=Docker container startup for %I
Requires=docker.service
After=docker.service
[Service]
TimeoutStartSec=40
Restart=always
# wait a while before restarting in case we are doing a restore;
# this includes a 'docker stop' command after we restore the data
RestartSec=60
ExecStartPre=-/usr/bin/docker stop %i
ExecStart=/usr/bin/docker start -a %i
ExecStop=/usr/bin/docker stop %i
TimeoutStopSec=60
[Install]
WantedBy=multi-user.target
Atualização Depois de pesquisar mais, encontrei essa postagem Como lidar adequadamente com um contêiner do Docker como um serviço do systemd? descreve o mesmo problema, mas não há resposta lá.
Parece que docker e systemd nem sempre se dão muito bem, veja:
Eu tenho exatamente a mesma configuração em uma máquina diferente (meu servidor de backup) e aqui tudo funciona bem. Eu posso executar o comando de desligamento e todos os contêineres do docker são desligados normalmente.
Portanto, o problema pode ser um problema de dependência. Talvez o systemd tenha encerrado algum serviço necessário aos contêineres do docker para que eles possam ser encerrados corretamente.
A versão do docker no sistema que 'falha' é
18.09.2
, no sistema que 'funciona' é18.06.1-ce
.o notas de versão do estado da versão do docker
18.09
:Quando adicionei as seguintes linhas aos meus arquivos de unidade:
e recarreguei os arquivos da unidade (
systemctl daemon-reload
), as coisas começaram a funcionar novamente. Meus contêineres não foram encerrados após o tempo limite de 1 minuto que defini, mas foram encerrados após alguns segundos.Eu tentei atualizar o docker para a versão
20.10.1
primeiro, sem sucesso.Tive a ideia dessa 'solução' quando me deparei com: https://github.com/sous-chefs/docker/issues/1062