Mik*_*war 10 systemd coreos etcd
我有两个服务A和B.
A在启动时设置etcd中的值,比如它从环境文件中获取的公共IP地址:
ExecStartPost=/usr/bin/etcdctl set /A_ADDR $COREOS_PUBLIC_IPV4
Run Code Online (Sandbox Code Playgroud)
B在启动时需要该值,以及它自己的IP地址.所以这样的事情会很好:
ExecStart=/usr/bin/docker run -e MY_ADDR=$COREOS_PUBLIC_IPV4 -e A_ADDR=$ETCD_A_ADDR mikedewar/B
Run Code Online (Sandbox Code Playgroud)
但这显然是不可能的,因为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'
Run Code Online (Sandbox Code Playgroud)
但它很难看.还是不敢相信我没有错过什么..
Ala*_*lle 12
直到最近,我一直在努力做同样的事情.在阅读了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'
Run Code Online (Sandbox Code Playgroud)
另外,我采用了一种模式,我的服务依赖于系统化的"oneshot"服务,该服务将计算一些值并将其写入/ etc/environment.这允许您将更复杂的shell脚本保留在主服务单元之外,并将其放入自己的onehot服务单元中.
以下是EnvironmentFile的文档:http://www.freedesktop.org/software/systemd/man/systemd.exec.html#EnvironmentFile=
最后,快速了解一下:如果在ExecStart/Stop命令中使用任何变量,则必须使用shell调用.systemd在执行您提供的命令时不执行shell调用,因此不会扩展变量.
容器可以etcd在启动时通过docker0桥接 IP 直接读取数据,而不是传入值吗?这还允许您对响应执行更复杂的逻辑,如果您将其存储为 etcd 值,则可以解析 JSON,等等。
| 归档时间: |
|
| 查看次数: |
4993 次 |
| 最近记录: |