【发布时间】:2014-10-13 07:21:00
【问题描述】:
我有两个服务 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 环境变量出现。相反,我可以在我的ExecStart 中执行某种/usr/bin/bash -c 'run stuff',但这很尴尬,特别是因为我需要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'
但它很丑陋。仍然不敢相信我没有错过任何东西..
【问题讨论】:
-
这有点用——但是当你的 docker 容器跌倒时 systemd 服务有时并没有意识到这一点。