CoreOSで実行しているサーバーインスタンスの検出サイドキックサービス用のかなり単純なユニットファイルがあります。ユニットファイルは次のようになります。
[Unit]
Description=Discovery for frontend server (instance %i)
BindsTo=frontend@%i.service
After=frontend@%i.service
[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/bash -c ' \
while true; do \
export PORT=$(docker port frontend%i 80 | sed s/.*://); \
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:$PORT" --ttl 60; \
sleep 45; \
done'
ExecStop=/usr/bin/etcdctl rm /services/frontend/%i
[X-Fleet]
MachineOf=frontend@%i.service
これは問題なく動作しますが、この段階に到達するには年齢がかかりました。etcdctl
行を次のように変更すると、
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \
次に、それは機能しません- 100.45.218.3:
ポートのないのような値を設定することになります。途中で、$PORT
変数のさまざまな使用法を試すのに多くの時間を費やしましたが、なぜ私が解決した構成が機能するのかわかりません。ある時点で、私はこれをスクリプトに含めました:
echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \
そして、このようなジャーナルログを得ました:
Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi
Aug 17 01:05:07 core-01 bash[53694]: hi
基本的に私の質問は:ここで何が起こっているのですか?これは、私{}
がbashスクリプトで作業することを理解する方法に直面します。そして、なぜ私は上、中括弧を使用することができますCOREOS_PRIVATE_IPV4
からエクスポートされた(変数/etc/environment
ではなく、ためにPORT
?