我正在使用CoreOS来安排系统单元与车队。 我有两个单元( firehose.service
和firehose-announce.service
。我试图让firehose-announce.service
启动并停止与firehose.service
。下面是firehose-announce.service
的单元文件:
[Unit] Description=Firehose etcd announcer BindsTo=firehose@%i.service After=firehose@%i.service Requires=firehose@%i.service [Service] EnvironmentFile=/etc/environment TimeoutStartSec=30s ExecStartPre=/bin/sh -c 'sleep 1' ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done" RestartSec=30s Restart=on-failure [X-Fleet] X-ConditionMachineOf=firehose@%i.service
我试图使用BindsTo
的概念,启动和停止的firehose.service
也将启动或停止firehose-announce.service
。 但是这从来不会发生。 如果firehose.service
停止,那么firehose-announce.service
将进入失败状态。 但是当我启动firehose.service
, firehose-announce.service
没有启动。
我在这里做错了什么?
我似乎终于绊倒了正确的组合,得到这个想要的工作。
在我的firehose-announce.service
单元中,我只设置了一个BindsTo
。 整个单位是:
[Unit] Description=Firehose etcd announcer BindsTo=firehose@%i.service [Service] EnvironmentFile=/etc/environment TimeoutStartSec=30s ExecStartPre=/bin/sh -c 'sleep 1' ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done" RestartSec=30s Restart=on-failure [X-Fleet] X-ConditionMachineOf=firehose@%i.service
这将导致firehose-announce.service
单元在firehose.service
执行时停止。 大。 但是我们如何再次启动呢?
我将这个依赖关系反转到我的firehose.service
像这样:
[Unit] Description=Firehose server Wants=firehose-announce@%i.service Before=firehose-announce@%i.service [Service] ExecStartPre=/usr/bin/docker pull firehose/server ExecStartPre=-/usr/bin/docker rm -f firehose-%i ExecStart=/usr/bin/docker run --name firehose-%i -p 7474 --env-file /home/core/firehose.env firehose/server ExecStop=/usr/bin/docker rm -f firehose-%i User=core TimeoutStartSec=5m TimeoutStopSec=20s RestartSec=30s Restart=on-failure [Install] WantedBy=multi-user.target [X-Fleet] X-Conflicts=firehose@*.service
这是说firehose.service
希望firehose-announce.service
在启动时启动(但是如果firehose-announce.service
无法启动则不会失败)。 它也确保firehose.service
在firehose-announce.service
之前启动。
我testing了这个,现在这个单位好像停下来,按照要求一起开始。