Вопрос или проблема
Я пытаюсь разобраться, почему systemd отправил сигнал завершения в dockerd. Это связано с этой постом на stackoverflow.
$ journalctl -r
Dec 01 06:25:05 ip-10-38-4-210 dockerd[2218]: time="2020-12-01T06:25:05.867748396Z" level=info msg="Обрабатываю сигнал 'terminated'"
Dec 01 06:25:05 ip-10-38-4-210 systemd[1]: Остановка движка контейнеров Docker...
Dec 01 06:25:03 ip-10-38-4-210 CRON[23453]: pam_unix(cron:session): сессия закрыта для пользователя root
Dec 01 06:25:01 ip-10-38-4-210 systemd[1]: Запуск ежедневного обновления apt и чистки...
Dec 01 06:25:01 ip-10-38-4-210 CRON[23454]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
Dec 01 06:25:01 ip-10-38-4-210 CRON[23453]: pam_unix(cron:session): сессия открыта для пользователя root (uid=0)
Dec 01 06:17:01 ip-10-38-4-210 CRON[23441]: pam_unix(cron:session): сессия закрыта для пользователя root
Dec 01 06:17:01 ip-10-38-4-210 CRON[23442]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Dec 01 06:17:01 ip-10-38-4-210 CRON[23441]: pam_unix(cron:session): сессия открыта для пользователя root (uid=0)
Dec 01 06:06:54 ip-10-38-4-210 CRON[23406]: pam_unix(cron:session): сессия закрыта для пользователя root
Последняя запись в журнале перед остановкой docker – это CRON[23453]: pam_unix(cron:session): сессия закрыта для пользователя root
, может быть, это как-то связано с вашей проблемой?
Это на Ubuntu 16.04.6 LTS на x86-64
В данном конкретном случае, причиной, заставляющей systemd остановить сервис docker, похоже, является служба автоматических обновлений Ubuntu, применяющая обновления для версии пакета containerd в Ubuntu. Есть открытая проблема, показывающая, что многие другие столкнулись с той же проблемой сегодня:
https://bugs.launchpad.net/ubuntu/+source/containerd/+bug/1870514
В связанной проблеме журнал включает:
Apr 03 06:09:31 server systemd[1]: Запуск ежедневного обновления apt и чистки...
...
Apr 03 06:09:43 server systemd[1]: Остановка движка контейнеров Docker...
Моя рекомендованная поправка – установить docker из официальных репозиториев Docker, которые, похоже, не имеют этой проблемы:
Я знаю, что уже есть принятый ответ, но …
Последняя запись в журнале перед остановкой docker – это CRON[23453]: pam_unix(cron:session): сессия закрыта для пользователя root, может быть, это как-то связано с вашей проблемой?
Да, это действительно кажется связанным, но не в этом контексте, все же отвечая здесь, чтобы люди, использующие docker без root, которые наткнутся на это в будущем, могли найти решение.
Я настроил docker в режиме без root и попробовал
запустить долгоживущие контейнеры docker в отключенном режиме (-d
флаг) под своим пользователем ubuntu
(это был экземпляр AWS Lightsail). Это привело к тому, что
мой демо́н docker и, следовательно, мои контейнеры корректно завершили работу.
Решение
Включите режим Linger
sudo loginctl enable-linger $USER
Для уверенности, отредактируйте /etc/systemd/logind.conf
и добавьте следующие
строки в конец.
UserStopDelaySec=infinity
KillUserProcesses=no
Перезагрузите вашу машину, чтобы новые настройки вступили в силу.
sudo reboot
Виновник
Виновником оказалась systemd
и то, как она обрабатывает процессы, запущенные сессиями входа (к которым также относятся сессии терминала SSH). По умолчанию systemd
отправляет SIGTERM
процессам через 10s
после выхода пользователя согласно документации.
UserStopDelaySec=
Указывает, как долго хранить запись о пользователе и услуги для пользователя [email protected] после того, как он полностью вышел. Если установлено в ноль, служба для пользователя завершится немедленно, когда последняя сессия пользователя завершится. Если эта опция настроена на ненулевое значение, циклы быстрого выхода/входа ускоряются, поскольку менеджер услуг пользователя не перезапускается постоянно. Если установлено “бесконечность”, служба для пользователя никогда больше не прекращается после первого входа и продолжает работать до завершения работы системы. По умолчанию 10 секунд.
KillUserProcesses=
Принимает логическое значение. Настраивает, должны ли процессы пользователя быть убиты, когда пользователь выходит из системы. Если true, то единица областей, соответствующая сессии, и все процессы внутри этой области будут завершены. Если false, область “брошена”, смотрите systemd.scope(5), и процессы не будут убиты. По умолчанию “нет”, но смотрите параметры KillOnlyUsers= и KillExcludeUsers= ниже.
Если, конечно, режим linger не включен, документировано здесь
enable-linger [USER...], disable-linger [USER...]
Включает/выключает пользователю linger для одного или нескольких пользователей. Если включено для конкретного пользователя, менеджер пользователя создается для пользователя при загрузке и удерживается после выхода. Это позволяет пользователям, которые не вошли в систему, запускать долгоживущие службы. Принимает одно или несколько имен пользователей или числовых UID в качестве аргумента. Если аргумент не указан, включает/выключает linger для пользователя сессии вызывающего.
Я написал об этом в блоге с некоторыми подробностями, если вы хотите это проверить.
Ответ или решение
Ситуация, когда systemd неожиданно отправляет сигнал об остановке демон Docker (dockerd), может быть вызвана несколькими факторами, и важно тщательно исследовать причины.
Возможные причины остановки Docker
На основе приведённого вами лога, видно, что перед тем как Docker был остановлен, выполнялись задачи CRON, связанные с обновлениями системы. В частности, сообщение в журнале systemd
гласит:
Dec 01 06:25:05 ip-10-38-4-210 dockerd[2218]: time="2020-12-01T06:25:05.867748396Z" level=info msg="Processing signal 'terminated'"
Dec 01 06:25:05 ip-10-38-4-210 systemd[1]: Stopping Docker Application Container Engine...
Это указывает на то, что действие, которое инициировало остановку Docker, может быть связано с фоновыми процессами, выполняемыми системой.
Специфика автоматических обновлений
Как вы отметили, причина остановки Docker может быть связана с сервисом автоматических обновлений в Ubuntu, который может перезагружать или останавливать некоторые службы, в том числе и Docker, если он зависит от каких-либо обновляемых пакетов (например, containerd
). Это подтверждается существованием открытой проблемы, где многие пользователи сталкиваются с аналогичными проблемами:
В данном случае рекомендуется установить Docker из официальных репозиториев Docker вместо стандартных репозиториев Ubuntu, так как это может помочь избежать данных проблем. Инструкции по установке можно найти здесь:
Документация Docker по установке на Ubuntu
Дополнительные рекомендации для решения проблем с Docker в режиме без прав суперпользователя (rootless)
Если вы используете Docker в режиме без прав суперпользователя и сталкиваетесь с его неожиданными остановками, есть несколько шагов, которые могут помочь:
-
Включите Linger для вашего пользователя:
Это позволит запустить сервисы для пользователя даже после выхода из системы.sudo loginctl enable-linger ваш_пользователь
-
Настройка конфигурации systemd:
Измените файл конфигурации/etc/systemd/logind.conf
, добавив следующие строки в конец файла:UserStopDelaySec=infinity KillUserProcesses=no
После внесения изменений перезагрузите систему:
sudo reboot
Заключение
Проблемы с неожиданной остановкой Docker часто связаны с поведением systemd
и его управлением процессами пользователей. Важно учитывать, что по умолчанию systemd
отправляет сигнал SIGTERM
процессам через 10 секунд после выхода пользователя. Настройка параметров UserStopDelaySec
и KillUserProcesses
может помочь устранить эту проблему, позволяя вашему Docker работать более устойчиво.
Если проблемы продолжаются, рассмотрите возможность обследования системных логов для диагностики других возможных причин и конфликтов между сервисами.