我有两个服务 A 和 B。
A 在启动时在 etcd 中设置一个值,比如它从环境文件中获取的公共 IP 地址:
ExecStartPost=/usr/bin/etcdctl set /A_ADDR $COREOS_PUBLIC_IPV4
B 在启动时需要该值以及它自己的 IP 地址。所以这样的事情会很好:
ExecStart=/usr/bin/docker run -e MY_ADDR=$COREOS_PUBLIC_IPV4 -e A_ADDR=$ETCD_A_ADDR mikedewar/B
但这显然是不可能的,因为 etcd 变量不会像这样的 systemd 环境变量出现。/usr/bin/bash -c 'run stuff'
相反,我可以在 my中做一些事情,ExecStart
但这很尴尬,尤其是当我需要 systemd 来扩展$COREOS_PUBLIC_IPV4
和我的新 bash shell 来扩展时$(etcdctl get /A_ADDR)
。它还散发着代码气味,让我觉得我错过了一些重要的东西。
有人能告诉我从 etcd 获取值到我的ExecStart
声明中的“正确”方式吗?
- 更新
所以我准备好了
ExecStart=/usr/bin/bash -c 'source /etc/environment && /usr/bin/docker run -e A_ADDR=$(/usr/bin/etcdctl get /A_ADDR) -e MY_ADDR=$COREOS_PUBLIC_IPV4 mikedewar/B'
但这很丑陋。仍然不敢相信我没有错过任何东西..