gpt4 book ai didi

shutdown - Systemd - 在 `ExecStop=` 期间运行实用程序 Docker 容器

转载 作者:行者123 更新时间:2023-12-02 03:31:11 29 4
gpt4 key购买 nike

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

我的目标

我的目标是在服务启动和停止时运行一个脚本,分别为服务添加和删除 DNS 服务器的记录。它在系统启动时启动服务时工作,或者在手动启动或关闭时工作 - 但在系统重新启动或停止时不工作(shutdown -r nowshutdown - h 现在).

这里是我使用的 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

这表明问题是(正如我在评论中推测的那样)我的 docker 容器在关闭期间不会启动。我已将以下行添加到我的 [Unit] 部分:

[Unit]
After=docker.service docker.socket
Requires=docker.service docker.socket
...

新行对 journalctl 错误没有影响,所以我现在的问题是,有没有办法在关闭之前运行实用程序 docker 容器?

最佳答案

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

在 fleet 上,当您使用 fleetctl destroy 销毁服务时,exec 停止行不会运行(类似于关机)。如果你想有一个清理 session ,你通常使用带有这个指令的卫星服务来实现这一点

服务文件.服务

[Unit]
Wants=cleanup@serviceFile.service

cleanup@serviceFile.service

[Unit]
PartOf=%i.service

关于shutdown - Systemd - 在 `ExecStop=` 期间运行实用程序 Docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26679681/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com