systemd Dockerコンテナの環境変数の継承

systemd Dockerコンテナの環境変数の継承

systemdを実行するDockerコンテナ。以下のアプリケーションに環境変数を渡したいと思います。

Dockerでsystemdを起動すると(/sbin/initコマンドラインで)、Dockerは変数をsystemdに公開しますが、子供サービスに連絡しないでくださいsystemd.setenv=...コマンドラインに追加すると、変数が渡されます。よりクリーンなソリューションを探しています。

/sbin/init実行されたアプリケーションに渡された環境変数を公開する方法は?

% docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -ti \
             -e VAR1=1 motiejus/systemd_fedora20 \
             init systemd.setenv=VAR2=2
...
Welcome to Fedora 20 (Heisenbug)!
...
[  OK  ] Reached target Multi-User System.
[root@740690365eb0 ~]# env | grep VAR
VAR2=2

VAR1=1コマンドを実行するときにそれを見たいです。

つまり、systemdは渡された変数を開始する子プロセスに渡すことができますか?

Dockerfileについては、以下を参照してください。githubリポジトリ

答え1

質問に答えてください(他の場所では答えがないようです)。

「/sbin/init に渡された環境変数を、その環境変数によって起動されたアプリケーションに公開するにはどうすればよいですか?」

少し迷惑なbashとLinux / procファイルシステムの非常に便利な機能が必要です。

# Import our environment variables from systemd
for e in $(tr "\000" "\n" < /proc/1/environ); do
        eval "export $e"
done

与えられたPID 1の環境ですが、nullで区切られた/proc/1/envionを読み込みます。 「tr」を使用して null 値を新しい行に置き換えてから、行を繰り返し、子プロセスが表示できるように「エクスポート」を追加して評価します。

環境変数を公開しないことはsystemdのもう一つの「機能」であり、バグとは見なされません。

答え2

この説明によると、systemdユーザーインスタンスは環境変数を継承しません。

https://wiki.archlinux.org/index.php/Systemd/User#Environment_variables

「最終」サービスの環境ファイルを構成するには、oneshot systemdサービスを使用することをお勧めします。

https://stackoverflow.com/questions/25396167/how-do-i-get-etcd-values-into-my-systemd-service-on-coreos

関連情報