CoreOS Systemd sidekick 单元无法启动

CoreOS Systemd sidekick 单元无法启动

我为一个 sidekick 单元提供了这项服务,但一直收到错误:[/run/fleet/units/[电子邮件保护]:11] 尾随垃圾,忽略。 [电子邮件保护]没有 ExecStart= 设置,该设置仅允许 RemainAfterExit=yes 服务。拒绝。

我似乎尝试了所有我能想到的不同组合,并成功地从终端测试了该命令,没有任何问题。如果我删除对 etcdctl 的第一次调用,第二个 set 命令也可以在服务文件中正常工作。有什么想法可以告诉我我哪里做错了吗?

[Unit]
Description=Tomcat web server etcd registration

# Requirements
Requires=etcd.service
Requires=tomcat@%i.service

# Dependency ordering and binding
After=etcd.service
After=tomcat@%i.service
BindsTo=tomcat@%i.service

[Service]

# Get CoreOS environmental variables
EnvironmentFile=/etc/environment

# Start

ExecStart=/bin/bash -c "\
while true; do \
    etcdctl set /services/tomcat/tomcat-%i/ip ${COREOS_PRIVATE_IPV4}:$(docker inspect --format='{{(index (index .NetworkSettings.Ports "8080/tcp") 0).HostPort}}' tomcat.%i) --ttl 180; \
    etcdctl set /services/bind/tomcat-%i ${COREOS_PRIVATE_IPV4} --ttl 180; \
  sleep 60; \
done"

# Stop
ExecStop=/usr/bin/etcdctl rm --recursive /services/tomcat/tomcat-%i

[X-Fleet]
# Schedule on the same machine as the associated Apache service
MachineOf=tomcat@%i.service

答案1

我可以通过在 /bin/bash -c 命令周围使用单引号、在 --format 周围使用双引号以及双重转义端口号来纠正错误。最终的完整 ExecStart 命令是:

ExecStart=/bin/bash -c '\
while true; do \
  etcdctl set /services/tomcat/tomcat-%i/ip ${COREOS_PRIVATE_IPV4}:$(docker inspect --format="{{(index (index .NetworkSettings.Ports \\"8080/tcp\\") 0).HostPort}}" tomcat.%i) --ttl 180; \
  etcdctl set /services/bind/tomcat-%i ${COREOS_PRIVATE_IPV4} --ttl 180; \
sleep 60; \
done'

相关内容