Как я могу запустить docker.service после nslcd.service? - PullRequest
0 голосов
/ 10 октября 2018

Все мои хосты Unix используют бэкэнд ldap.

docker группа существует в ldap, поэтому docker.service должен запускаться после nslcd.service.

Я попытался отредактировать systemctl начальную конфигурацию для docker.service:

$ sudo systemctl edit --full docker.service

И я добавляю nslcd.service к After, Wants, Requires:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service nslcd.service
Wants=network-online.target nslcd.service
Requires=docker.socket nslcd.service

Я все еще не могу заставить докер работать после этой службы:

sudo service docker status
● docker.service - Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: https://docs.docker.com

Oct 10 19:35:02 dev-08 systemd[1]: Dependency failed for Docker Application Container Engine.

Нет проблем, чтобы запустить контейнер вручную после запуска, так как я вхожу через ldap.

1 Ответ

0 голосов
/ 10 октября 2018

группа докеров существует в ldap, поэтому docker.service должен запускаться после nslcd.service.

Обычно плохая идея, чтобы системные службы зависели от пользователейи группы в удаленной службе каталогов (поскольку проблемы со службой каталогов могут повлиять на доступность службы на вашем хосте).

И я добавляю nslcd.service в After, хочет, требует

Указание отношений Wants= и Requires= является избыточным.Отношение Requires= является просто более сильной версией Wants=: использование Requires= означает, что если вы запустите службу docker, а nslcd еще не запущен, она также будет запущена.Используя Wants= в той же ситуации, docker запустится без запуска nslcd.

Мне все еще не удается запустить Docker после этой службы

Вполне вероятно, что nslcd требуется время для подключения к службе каталогов.В этом случае возможно, что процесс запущен, что удовлетворяет зависимости After=, поэтому docker запускается, даже если ваши группы еще не доступны.

Есть несколькоспособы решения этой ситуации:

  1. В свете моего первоначального комментария, просто создайте локальную группу docker.Это, безусловно, самое простое и надежное решение.

  2. Создайте новый юнитшот, который вращается, пока не существует группа docker.Установите этот модуль в зависимости от nslcd, а docker - в зависимости от нового модуля.

  3. Возможно замените 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"
...