3

我正在测试 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 容器?

4

2 回答 2

1

如果我理解您的目标,您希望在服务器关闭时运行一些 DNS 清理,并且您正尝试在 systemd docker 服务文件中执行此操作。你为什么不使用舰队来完成这项任务?尝试创建一个舰队单元文件来监控你的 DNS 服务器,当它检测到服务器不可访问时,你可以启动你的清理任务。

在舰队上,当您使用fleetctl destroy销毁服务时,exec stop 行不会运行(类似于关机)。如果您想进行清理会话,通常使用带有此指令的卫星服务来实现此目的

服务文件服务

[Unit]
Wants=cleanup@serviceFile.service

cleanup@serviceFile.service

[Unit]
PartOf=%i.service
于 2015-04-29T08:39:27.273 回答
0

您可以启动 2 个不同的服务并使用 bindsTo 绑定它们,而不是在一个单元文件中启动所有内容,以便它们一起启动和停止:http ://www.freedesktop.org/software/systemd/man/systemd.unit.html#绑定到=

这将创建两个简单且更小的单元文件,每个文件处理一个容器。它还可以让您更轻松地进行调试。

于 2015-04-30T10:29:28.967 回答