Linux 如何在nslcd.service之后启动docker.service?

Linux 如何在nslcd.service之后启动docker.service?,linux,docker,unix,service,systemctl,Linux,Docker,Unix,Service,Systemctl,我的所有unix主机都使用ldap后端 ldap上存在docker组,这也是docker.service必须在nslcd.service之后启动的原因 我已尝试编辑docker.service的systemctl启动配置: 我将nslcd.service添加到After,Wants,Requires: 我仍然无法让docker运行该服务: sudo service docker status ● docker.service - Docker Application Container Engi

我的所有unix主机都使用ldap后端

ldap上存在docker组,这也是docker.service必须在nslcd.service之后启动的原因

我已尝试编辑docker.service的systemctl启动配置:

我将nslcd.service添加到After,Wants,Requires:

我仍然无法让docker运行该服务:

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登录的

ldap上存在docker组,这也是docker.service必须在nslcd.service之后启动的原因

让系统服务依赖于远程目录服务中的用户和组通常不是一个好主意,因为目录服务的问题可能会影响主机上的服务可用性

我将nslcd.service添加到After,Wants,Requires

同时指定Wants=和Requires=关系是多余的。Requires=关系只是Wants=:using Requires=的一个更强大的版本,这意味着如果您启动docker服务,并且nslcd尚未运行,那么它也将启动。使用Wants=在相同的情况下,docker将在不启动nslcd的情况下启动

我仍然无法让docker运行那个服务

nslcd很可能需要一点时间才能连接到目录服务。在这种情况下,流程可能已经启动,这满足After=依赖关系,因此docker启动,即使您的组还不可用

有几种方法可以解决这种情况:

根据我最初的评论,只需创建一个本地docker组。这是迄今为止最简单、最稳健的解决方案

创建一个新的oneshot单元,旋转直到docker组存在。使此单元依赖于nslcd,使docker依赖于新单元

可能将nslcd替换为实现本地缓存的东西(例如)也可以解决此问题

另一方面,像本例中所做的那样直接编辑单元文件是一个坏主意,因为如果您通过打包工具apt/yum/etc安装了Docker,那么您的修改将在下次升级包时被覆盖。一个更好的解决方案是创建以增强单元配置

更新

选项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"
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.
[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"