【发布时间】:2014-10-31 16:52:05
【问题描述】:
我正在测试 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=... 行。我花了一些时间试图弄清楚为什么服务没有正确关闭后添加了它。它什么也没做。然而,根据docs,服务默认有Conflicts=shutdown.target 行。当服务发生冲突并且一个启动时,另一个会关闭 - 或者文档是这样说的。
我错过了什么?为什么我的ExecStop= 行不运行?
更新
我确定ExecStop= 行确实可以运行。使用journalctl -u registry.service -n 200 给了我这个消息:
Error response from daemon: Cannot start container 7b9083a3f81710febc24256b715fcff1e8146c867500c6e8ce4d170ad1cfd11a: dbus: connection closed by user
这表明问题是(正如我在 cmets 中推测的那样)我的 docker 容器在关闭期间不会启动。我在[Unit] 部分添加了以下几行:
[Unit]
After=docker.service docker.socket
Requires=docker.service docker.socket
...
新行对 journalctl 错误没有影响,所以我现在的问题是,有没有办法在关闭之前运行实用程序 docker 容器?
【问题讨论】:
-
嗯。我添加了一行
ExecStop=touch /home/me/shutdown并在重新启动后找到了该文件。问题可能与网络有关,还是系统在关闭开始后拒绝启动容器? -
添加网络依赖没有帮助,仍在寻找原因。
标签: shutdown reboot systemd coreos