我正在consul
尝试建立一个小型 CoreOS 集群。如果我将以下文件保存到/etc/systemd/system/consul.service
,启用服务并重新启动 VM,集群中的所有 3 个 vm 将愉快地正常启动并加入到一起
[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
命令中删除注释,则启动将失败,因为在 vms 重新启动后没有 consul 容器正在运行。systemctl --failed
虽然没有报告任何服务失败。
我究竟做错了什么?我误会了ExecStop
吗?Consul
?
问题(或至少一个问题)是您
-d
在ExecStart=
.systemd 期望它运行的命令在服务启动时保持运行,换句话说,在前台运行。至少在设置服务时
Type=simple
,这是默认类型并且适用于您的单位。当您运行一个立即退出的命令时(就像
docker run -d
确实如此),systemd 假定您的服务启动并只停留片刻直到它完成。因此,当您的容器仍在运行时,systemd 服务会认为它不是。您可以使用类似的命令来确认systemctl status consul.service
。(经常检查此命令以帮助您了解 systemd 认为您的服务状态是什么。在此处发布其输出以帮助我们诊断您遇到的任何其他问题。)当您有一些
ExecStopPost=
命令时给您带来麻烦的是 systemd 将执行这些命令,因为它假定服务已完成,因此会杀死您的容器。只需
-d
从您docker run
的ExecStart=
命令中删除可能就足以解决您的问题。