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のもう一つの「機能」であり、バグとは見なされません。

おすすめ記事