10

AとBの2つのサービスがあります。

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'代わりに、自分で何らかの操作を行うことができますが、ExecStart特に systemd を展開する必要が$COREOS_PUBLIC_IPV4あり、新しい bash シェルを展開する必要があるため、厄介です$(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'

しかし、それはかなり醜いです。何かを見逃していないなんて、まだ信じられない..

4

3 に答える 3

3

私は現在、そのような回避策を使用しています:

特定の etcd ディレクトリからデータを抽出するスクリプトを作成しました

#! /bin/sh
for entry in `etcdctl ls /my_dir --recursive`  ; do
  echo ' -e '`grep -o '[^/]*$'  <<< ${entry}`=`etcdctl get ${entry}`
done

その出力は次のようになります。

 -e DATABASE_URL=postgres://m:m@mi.cf.us-.rds.amazonaws.com:5432/m
 -e WEB_CONCURRENCY=4

そのため、最終的にはinitファイルにそのような方法で配置できます

/bin/sh -c '/usr/bin/docker run -p 9000:9000 $(/home/core/envs.sh) me/myapp -D FOREGROUND'

これは最もエレガントな方法ではなく、改善方法を知りたいのですが、 for ループをワンライナーとして配置するには、多くのエスケープが必要です。

于 2015-03-18T14:37:26.280 に答える
1

コンテナは、値を渡す代わりに、ブリッジ IPetcdを介して開始時に直接読み取ることができますか? docker0これにより、応答に対してより複雑なロジックを実行したり、JSON を etcd 値として保存している場合は JSON を解析したりすることもできます。

于 2014-08-20T03:22:51.390 に答える