私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サービスを使用することをお勧めします。