私のサービスのために複数のコンテナを起動するdocker-composeファイルがあります。これらのコンテナの1つには、環境変数セット(正確にはサーバーのパブリックIP)が必要です。オペレーティングシステムは、新しくインストールされたUbuntu 15.10 Server仮想マシンです。
私はsystemdを通してこの機能を提供する方法を見つけようとしています。これまで私が思いついた最高は次のとおりです。
[Unit]
Description=service for my product
Requires=docker.service
After=docker.service
[Service]
Environment=MY_MASTER_IP=`/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/'`
Environment=MY_NETWORK_NAME="mynetwork"
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /app/master/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /app/master/docker-compose.yml stop
[Install]
WantedBy=local.target
ただし、systemdを使用すると、systemd-analyze verify myapp.service
crazy shellコマンドを含む行が無効になり、無視されるように求められます。
[/lib/systemd/system/myapp.service:8] Invalid environment assignment, ignoring: MY_MASTER_IP=`/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/')`
また、upstartで行ったように、docker-composeコマンド()の直前に変数を割り当てようとしましたが、MY_MASTER_IP=blah blah blah /docker-compose yadda yadda
systemdはそれを気にしませんでした。
では、環境線をこのように使用してもよいでしょうか?そうでなければ、これを処理するための最良の/最もエレガントで/最も簡単な方法は何ですか?
答え1
いいえ、systemdデバイスはシェルスクリプトではなく、コマンドの置き換えをサポートしていないためです。これは意図的なデザイン決定です。