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

Dim*_*iwa -1 unix linux service docker systemctl

我所有的 UNIX 主机都使用 LDAP 后端。

\n\n

docker组已存在于 ldap 上,这也是为什么docker.service必须在nslcd.service.

\n\n

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

\n\n
$ sudo systemctl edit --full docker.service\n
Run Code Online (Sandbox Code Playgroud)\n\n

我添加nslcd.serviceAfter,,WantsRequires

\n\n
[Unit]\nDescription=Docker Application Container Engine\nDocumentation=https://docs.docker.com\nAfter=network-online.target docker.socket firewalld.service nslcd.service\nWants=network-online.target nslcd.service\nRequires=docker.socket nslcd.service\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
sudo service docker status\n\xe2\x97\x8f docker.service - Docker Application Container Engine\n   Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: enabled)\n   Active: inactive (dead)\n     Docs: https://docs.docker.com\n\nOct 10 19:35:02 dev-08 systemd[1]: Dependency failed for Docker Application Container Engine.\n
Run Code Online (Sandbox Code Playgroud)\n\n

启动后手动启动容器没有问题,因为我是通过ldap登录的。

\n

lar*_*sks 5

docker 组存在于 ldap 上,这也是为什么 docker.service 必须在 nslcd.service 之后启动。

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

我将 nslcd.service 添加到 After、Wants、Requires 中

同时指定 aWants=和 aRequires=关系是多余的。这种Requires=关系只是更强的版本Wants=:usingRequires=意味着如果您启动该docker服务,并且nslcd该服务尚未运行,那么它也会启动。Wants=在同样的情况下使用,docker会启动而不启动nslcd

我仍然无法让 docker 在该服务之后运行

nslcd连接到目录服务很可能需要一些时间。在这种情况下,该进程可能已启动,这满足了After=依赖性,因此docker即使您的组尚不可用,该进程也会启动。

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

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

  2. 创建一个新的一次性单位,该单位会旋转直至该docker组存在。使单位依赖于nslcd,并使docker依赖于新单位。

  3. 可能nslcd用实现本地缓存的东西(例如sssd)替换也可以解决这个问题。

另一方面,像本例中那样直接编辑单元文件是一个坏主意,因为如果您通过打包工具(apt/yum/等)安装了 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"
Run Code Online (Sandbox Code Playgroud)