我正在consul
尝试建立一个小型 CoreOS 集群。如果我将以下文件保存到/etc/systemd/system/consul.service
,启用服务,然后重新启动虚拟机,集群中的所有 3 个虚拟机将愉快地正常启动并连接在一起
[Unit]
Description=consul
After=etcd2.service
After=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill consul
ExecStartPre=-/usr/bin/docker rm consul
ExecStart=/usr/bin/docker run -d --name consul --network host consul agent -server -bootstrap-expect=3 -data-dir /tmp/consul -bind BIND_IPADDR --node NODE_NAME -retry-join IPADDR1 -retry-join IPADDR2
# ExecStop=/usr/bin/docker container exec consul consul leave
# ExecStopPost=/usr/bin/docker container stop consul
# ExecStopPost=/usr/bin/docker container rm consul
[Install]
WantedBy=multi-user.target
但是,如果我从命令中删除注释ExecStop
,则启动将失败,因为虚拟机重新启动后没有领事容器正在运行。systemctl --failed
但不会报告任何服务失败。
我究竟做错了什么?我是不是误会了ExecStop
?Consul
?
答案1
问题(或者至少一问题)是-d
您在ExecStart=
.
systemd 希望它运行的命令在服务启动时保持运行,换句话说,在前台运行。至少在设置 的服务时Type=simple
,这是默认类型并且适用于您的设备。
当您运行一个立即退出的命令时(就像这样docker run -d
做),systemd 假设您的服务已启动并仅保持一段时间直至完成。因此,当您的容器仍在运行时,systemd 服务会认为它没有运行。您可以使用类似 的命令来确认这一点systemctl status consul.service
。 (经常检查此命令可以帮助您了解 systemd 认为您的服务状态是什么。在此处发布其输出以帮助我们诊断您遇到的任何进一步问题。)
当您有一些命令时,给您带来麻烦的ExecStopPost=
是 systemd 将执行这些命令,因为它假设服务已完成,因此会杀死您的容器。
-d
只需从命令docker run
中删除ExecStart=
就足以解决您的问题。