【问题标题】:Systemd - Run Utility Docker Container During `ExecStop=`Systemd - 在 `ExecStop=` 期间运行实用程序 Docker 容器
【发布时间】:2014-10-31 16:52:05
【问题描述】:

我正在测试 CoreOS,看看它是否满足我们的需求,到目前为止,进展有点慢,但还可以。我喜欢 systemd,但它似乎无法正常工作 - 特别是在关机时。

我的目标

我的目标是在服务启动和停止时运行一个脚本,分别从我们的 DNS 服务器添加和删除服务记录。它在系统启动时启动服务,或者手动启动或关闭服务时工作 - 但在系统重新启动或停止时不起作用(shutdown -r nowshutdown -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


【解决方案1】:

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

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

serviceFile.service

[Unit]
Wants=cleanup@serviceFile.service

cleanup@serviceFile.service

[Unit]
PartOf=%i.service

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 2019-01-29
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多