группа докеров существует в ldap, поэтому docker.service должен запускаться после nslcd.service.
Обычно плохая идея, чтобы системные службы зависели от пользователейи группы в удаленной службе каталогов (поскольку проблемы со службой каталогов могут повлиять на доступность службы на вашем хосте).
И я добавляю nslcd.service в After, хочет, требует
Указание отношений Wants=
и Requires=
является избыточным.Отношение Requires=
является просто более сильной версией Wants=
: использование Requires=
означает, что если вы запустите службу docker
, а nslcd
еще не запущен, она также будет запущена.Используя Wants=
в той же ситуации, docker
запустится без запуска nslcd
.
Мне все еще не удается запустить Docker после этой службы
Вполне вероятно, что nslcd
требуется время для подключения к службе каталогов.В этом случае возможно, что процесс запущен, что удовлетворяет зависимости After=
, поэтому docker
запускается, даже если ваши группы еще не доступны.
Есть несколькоспособы решения этой ситуации:
В свете моего первоначального комментария, просто создайте локальную группу docker
.Это, безусловно, самое простое и надежное решение.
Создайте новый юнитшот, который вращается, пока не существует группа docker
.Установите этот модуль в зависимости от nslcd
, а docker
- в зависимости от нового модуля.
Возможно замените nslcd
чем-то, что реализует локальное кэширование (например, sssd ) также решит эту проблему.
С другой стороны, плохая идея - напрямую редактировать файлы модулей, как вы делали в этомНапример, если вы установили Docker с помощью инструментов упаковки (apt / yum / etc), ваши изменения будут перезаписаны при следующем обновлении пакета.Лучшим решением является создание вставляемых файлов для расширения конфигурации устройства.
Обновление
Вариант 2 может выглядеть следующим образом:
[Unit]
Requires=nslcd.service docker.service
After=nslcd.service
Before=docker.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c "while ! getent group docker; do sleep 1; done"