代码之家  ›  专栏  ›  技术社区  ›  Dimitri Kopriwa

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

  •  -1
  • Dimitri Kopriwa  · 技术社区  · 7 年前

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

    docker docker.service 必须在之后开始 nslcd.service

    我试过编辑 systemctl 的启动配置 码头服务

    $ sudo systemctl edit --full docker.service
    

    我补充说 nslcd.服务 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
    

    我仍然无法让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.
    

    1 回复  |  直到 7 年前
        1
  •  4
  •   larsks    7 年前

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

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

    Wants= 和一个 Requires= 关系是多余的。这个 需要= 关系只是一个更强大的版本 :使用 需要= docker 服务,以及 nslcd 尚未运行,也将启动。使用 想要= 在同样的情况下, 码头工人 nslcd公司 .

    完全有可能 nslcd公司 连接到目录服务需要一些时间。在这种情况下,有可能 过程 已经开始,这满足了 After= 依赖,所以

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

    1. 码头工人 组。这是迄今为止最简单、最健壮的解决方案。

    2. 创建一个新的单镜头单位,旋转到 码头工人 单位依赖 ,并使

    3. 可能更换 nslcd公司 sssd

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

    更新

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