我正在测试 CoreOS,看看它是否满足我们的需求,到目前为止,进展有点慢,但还可以。我喜欢 systemd,但它似乎不能正常工作——特别是在关机时。
我的目标
我的目标是在服务启动和停止时运行一个脚本,分别从我们的 DNS 服务器添加和删除服务记录。它在系统启动时启动服务,或者手动启动或关闭服务时起作用 - 但在系统重新启动或停止时(shutdown -r now
, shutdown -h now
)不起作用。
这是一个稍微简化的 docker 注册表服务版本,我正在使用该服务作为示例:
[Unit]
Description=Docker Registry
After=docker.service
Before=registry-ui.service
Wants=registry-ui.service
[Service]
Conflicts=halt.target poweroff.target reboot.target shutdown.target sleep.target
TimeoutStartSec=0
Restart=on-failure
ExecStartPre=-/usr/bin/docker kill Registry
ExecStartPre=-/usr/bin/docker rm Registry
ExecStartPre=-/usr/bin/docker run --rm myrepo:5000/tool runtool arg1 arg2
ExecStart=/usr/bin/docker run various args registry:latest
ExecStop=-/usr/bin/docker run --rm myrepo:5000/tool runtool arg1 arg2
ExecStop=-/usr/bin/docker stop Registry
[X-Fleet]
MachineID=coreos1
[Install]
WantedBy=multi-user.target
RequiredBy=registry-ui.service
Also=registry-ui.service
(这个单元与另一个单元一起工作 - registry-ui.service。当一个单元启动时,另一个单元也会这样做。)
注意Conflicts=...
线。我花了一些时间试图弄清楚为什么服务没有正确关闭后添加了它。它什么也没做。然而,根据文档,服务Conflicts=shutdown.target
默认有一行。当服务发生冲突并且一个启动时,另一个关闭 - 或者文档说。
我错过了什么?为什么我的ExecStop=
线路不运行?
更新
我已经确定ExecStop=
线路确实运行。使用journalctl -u registry.service -n 200
给了我这个消息:
Error response from daemon: Cannot start container 7b9083a3f81710febc24256b715fcff1e8146c867500c6e8ce4d170ad1cfd11a: dbus: connection closed by user
这表明问题是(正如我在评论中推测的那样)我的 docker 容器在关闭期间不会启动。我在我的[Unit]
部分中添加了以下几行:
[Unit]
After=docker.service docker.socket
Requires=docker.service docker.socket
...
新行对 journalctl 错误没有影响,所以我现在的问题是,有没有办法在关闭之前运行实用程序 docker 容器?