Контейнеры пользователя останавливаются после выхода из системы
Контейнеры без прав root запускаются пользовательскими службами. Менеджер пользователя завершается при выходе из системы и уносит их с собой. Решение — разрешить менеджеру работать без входа; иначе контейнеры живут только до конца сеанса.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Продолжение работы без входа не включено
Менеджер пользователя завершается при выходе последнего сеанса. Все его службы останавливаются.
-
Unit-файлы созданы, но не включены
Файл службы контейнера создан в пользовательском каталоге и не включён. После перезагрузки контейнер не поднимается.
-
Контейнеры без прав root упираются в пределы пользователя
Число процессов и описателей у пользовательского сеанса ограничено отдельно. Контейнеры упираются в них раньше, чем в системные.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Работает ли менеджер пользователя без входа.
loginctl show-user "$USER" -p LingerСостояние служб контейнеров пользователя.
systemctl --user list-units "*container*" --no-legendЖурнал службы контейнера.
journalctl --user -u container-myapp.service -n 20 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Менеджер пользователя завершается при выходе последнего сеанса. Все его службы останавливаются.
- Как проверить
-
Посмотрите состояние продолжения работы.
loginctl show-user "$USER" -p Linger systemctl --user list-units "*container*" --no-legend | head
- Как исправить
-
Включите продолжение работы для пользователя. Без этого пользовательские службы не годятся для постоянно работающих контейнеров.
sudo loginctl enable-linger deploy
- Почему происходит
- Файл службы контейнера создан в пользовательском каталоге и не включён. После перезагрузки контейнер не поднимается.
- Как проверить
-
Посмотрите состояние пользовательских служб.
systemctl --user list-unit-files "*container*" --no-legend systemctl --user is-enabled container-myapp.service 2>/dev/null
- Как исправить
-
Включите службу в пользовательской области и перечитайте описания. Включение в системной области для пользовательских служб не работает.
systemctl --user daemon-reload && systemctl --user enable --now container-myapp.service
- Почему происходит
- Число процессов и описателей у пользовательского сеанса ограничено отдельно. Контейнеры упираются в них раньше, чем в системные.
- Как проверить
-
Посмотрите пределы пользовательского среза.
systemctl show "user-$(id -u).slice" -p TasksMax -p MemoryMax ulimit -u
- Как исправить
- Поднимите пределы пользовательского среза, если контейнерам их не хватает. Системные пределы на пользовательские службы не влияют.
Пример вывода
Контейнер остановился вместе с сеансом пользователя. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1520]: Stopping container-myapp.service - Podman container-myapp.service...
systemd[1520]: Stopped container-myapp.service.
systemd[1]: user@1001.service: Deactivated successfully.
$ loginctl show-user deploy -p Linger
Linger=no
Связанные ошибки
- Служба пользователя не запускается или не переживает выход systemctl --user: служба останавливается при выходе из системы. Разбор lingering и отличий от системных служб.
- Таймер пользователя не срабатывает Таймер в менеджере пользователя не работает без входа в систему: нужна задержка сеанса.
- Записи пользовательской службы не находятся обычным запросом journalctl -u не находит записи: пользовательские службы требуют указания области.
- Failed to connect to bus: подключение к шине недоступно Команды systemctl не работают: нет подключения к шине. Разбор для контейнеров, сеансов по ssh и служб пользователя.
- Function not implemented в контейнере Ошибка 38 при системном вызове: вызов запрещён фильтром или отсутствует в окружении. Разбор для контейнеров.
- status=219/CGROUP в systemd Код 219/CGROUP: не удалось создать или настроить контрольную группу службы. Причины на уровне системы и контейнеров.
- status=225/NETWORK в systemd Код 225/NETWORK: не удалось создать сетевое пространство имён для службы при PrivateNetwork=yes или NetworkNamespacePath=.
- status=237/KEYRING в systemd Код 237/KEYRING: не удалось подготовить связку ключей ядра для службы. Обычно ограничение окружения или исчерпание квоты.
Источники
-
loginctl(1)
Продолжение работы менеджера пользователя без входа. - Документация Podman: службы systemd для контейнеров
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на systemd 255: выход из системы останавливает службы пользователя без продолжения работы.