systemd - 如何在 coreOS 上将 etcd 值添加到我的 systemd 服务中?

标签 systemd coreos etcd

我有两个服务 A 和 B。

A 在启动时在 etcd 中设置一个值,比如它从环境文件中获取的公共(public) 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'在我的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'

但这很丑陋。仍然不敢相信我没有错过任何东西..

最佳答案

直到最近,我一直在为同样的事情而苦苦挣扎。在阅读了 CoreOS 和 systemd 的大部分文档之后,这里有一个稍微“更干净”的版本:

[Service]
EnvironmentFile=/etc/environment
ExecStart=/bin/sh -c '/usr/bin/docker run -e A_ADDR=$(/usr/bin/etcdctl get /A_ADDR) -e MY_ADDR=$COREOS_PUBLIC_IPV4 mikedewar/B'

此外,我采用了一种模式,我的服务依赖于 systemd 的“oneshot”服务,该服务将计算一些值并将其写入/etc/environment。这允许您将更复杂的 shell 脚本保留在主服务单元之外,并将其放入它自己的 oneshot 服务单元中。

以下是 EnvironmentFile 的文档:http://www.freedesktop.org/software/systemd/man/systemd.exec.html#EnvironmentFile=

最后,一个快速的问题:如果您在 ExecStart/Stop 命令中使用任何变量,则必须使用 shell 调用。 systemd 在执行您提供的命令时不会调用 shell,因此不会扩展变量。

关于systemd - 如何在 coreOS 上将 etcd 值添加到我的 systemd 服务中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25396167/

相关文章:

drupal - Docker和Drupal 8-settings.php

linux - docker 将 cgroup 驱动程序更改为 systemd

logging - Docker 容器日志占用了我所有的磁盘空间

kubernetes - 具有新 etcd 卷的新 master 不会加入集群

kubernetes - etcd v3 无法读取编码值

linux - 在 systemd 服务的 ExecStart 命令路径中使用变量

linux - 如何禁用 systemd 日志记录到控制台?

bash - 如何检查我的本地 docker 镜像是否已过时,而无需从其他地方推送?

go - 无法使用 Docker 容器自动运行简单的 Go Web 服务器(func (*Template) Execute)

amazon-web-services - AWS上的Disaster Recovery Kops Kubernetes主节点