Я запускаю несколько контейнеров docker на своем сервере Ubuntu. Они контролируются systemd.
Если я запускаю контейнер завершает работу корректно. Вывод journalctl следующий (вывод в обратном времени, самые новые сверху):systemctl stop [email protected]
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...
Однако если я выполню shutdown -h now
, я получу:
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...
Контейнер не останавливается, и процесс в конечном итоге завершается через 2 минуты, и контейнер прерывается.
Что является причиной этого?
Я хотел бы, чтобы мои контейнеры завершали работу корректно, чтобы работающие в них службы останавливались без потери данных.
Мой файл обслуживания:
[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
ОбновлятьПосле того, как я поискал дальше, я нашел этот постКак правильно работать с контейнером Docker как с сервисом systemd?описывает ту же проблему, но ответа там нет.
решение1
Похоже, docker и systemd не всегда хорошо ладят, см.:
У меня точно такая же настройка на другой машине (мой резервный сервер), и здесь все работает отлично. Я могу выполнить команду shutdown, и все контейнеры docker будут корректно остановлены.
Так что проблема может быть в зависимости. Возможно, systemd закрыл какую-то службу, которая нужна контейнерам docker, чтобы их можно было закрыть должным образом.
Версия Docker в системе, которая «дает сбой», — 18.09.2
, в системе, которая «работает», — 18.06.1-ce
.
Theзаметки о выпускедля состояния версии Docker 18.09
:
In Docker versions prior to 18.09, containerd was managed
by the Docker engine daemon. In Docker Engine 18.09,
containerd is managed by systemd.
Когда я добавил следующие строки в файлы своего модуля:
[Unit]
...
Requires=containerd.service
After=containerd.service
и перезагрузил файлы юнитов ( systemctl daemon-reload
), все снова заработало. Мои контейнеры не были завершены после установленного мной тайм-аута в 1 минуту, а закрылись через несколько секунд.
Я попробовал обновить Docker до версии 20.10.1
First, но безрезультатно.
Идея этого «решения» возникла у меня, когда я наткнулся на:https://github.com/sous-chefs/docker/issues/1062