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 repository を参照してください。
尋ねられた質問に答えるため(他のどこにも答えられていないようです)
「/ 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に指定された環境である/ proc/1/envionを読み取りますが、ヌルで区切られています。 'tr'を使用してnullを新しい行に置き換え、それらの行を反復処理し、先頭に "export"を付けて評価し、子プロセスから見えるようにします。
Not-exposed-environment-variablesはsystemdのもう1つの「機能」であり、バグとは見なされていません。
この説明によると、systemdユーザーインスタンスは環境変数を継承しません。
https://wiki.archlinux.org/index.php/Systemd/User#Environment_variables
「最終的な」サービス用にEnvironmentFileを構成するoneshot systemdサービスを使用することがここで提案されています。