SystemD 不运行 ExecStartPre,直到我重新加载并重新启动服务

Naf*_*Kay 7 systemd

我正在覆盖/usr/lib/systemd/system/docker.service启动脚本以使用环境文件扩展它。我已经定义了我的配置文件,/etc/systemd/system/docker.service.d/docker.conf如下所示:

test -d /etc/systemd/system/docker.service.d || \
    mkdir /etc/systemd/system/docker.service.d

cat > /etc/systemd/system/docker.service.d/docker.conf <<EOF
[Service]
EnvironmentFile=/etc/sysconfig/docker
ExecStartPre=-/usr/local/sbin/generate-docker-config
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --dns=\${LOCAL_IPV4}
EOF

systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

我正在以Packer 的身份运行上述脚本AMI构建步骤。

当我启动我的 AMI 时,我看到以下关于 SystemD Docker 服务的状态输出:

? docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           ??docker.conf
   Active: active (running) since Mon 2016-03-28 21:16:11 UTC; 6min ago
     Docs: https://docs.docker.com
 Main PID: 858 (docker)
   CGroup: /system.slice/docker.service
           ?? 858 /usr/bin/docker daemon -H fd:// --dns=10.224.4.178 --log-driver=syslog --log-opt tag={{.ImageName}}
Run Code Online (Sandbox Code Playgroud)

它没有运行 my ExecStartPre,如输出所示。如果我执行以下操作,我看到它现在已经运行了启动脚本:

# systemctl daemon-reload && systemctl restart docker.service && \
    systemctl status docker.service
? docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           ??docker.conf
   Active: active (running) since Mon 2016-03-28 22:05:24 UTC; 24ms ago
     Docs: https://docs.docker.com
  Process: 1873 ExecStartPre=/usr/local/sbin/generate-docker-config (code=exited, status=0/SUCCESS)
 Main PID: 1876 (docker)
   CGroup: /system.slice/docker.service
           ??1876 /usr/bin/docker daemon -H fd:// --dns=10.224.4.178 --log-driver=syslog --log-opt tag={{.ImageName}}
Run Code Online (Sandbox Code Playgroud)

请注意它现在如何 ExecStartPre在状态输出中显示?

除了daemon-reload使 SystemD 加载和运行新的服务配置文件和ExecStartPre脚本之外,是否还有我应该在 Packer 构建中运行的命令?我应该只是restart使用 Packer 构建中的服务,还是有更好、更量身定制的解决方案?

注意:我的ExecStartPre脚本需要可curl用于 EC2 实例标签的网络。Docker 服务文件确实指定了,After=network.target docker.socket所以我假设它会在网络启动后运行。

And*_*mes 1

嗯,这是预期的行为。如果您打算在覆盖 docker 单元文件后重新启动 docker 服务,则应该在脚本中调用systemctl restart docker.serviceafter 。systemctl daemon-reload如果您还想仅在已运行的情况下重新启动 dokett,请改为调用systemctl try-restart docker.service

命令的目的systemctl daemon-reload是告诉systemd守护进程重新加载其所有配置,重新加载单元文件并重新生成服务依赖关系树。但是,即使磁盘上的单元文件发生更改,它也不会影响系统中的任何其他服务。