web-dev-qa-db-ja.com

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 repository を参照してください。

9

尋ねられた質問に答えるため(他のどこにも答えられていないようです)

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

9
xrobau

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

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

「最終的な」サービス用にEnvironmentFileを構成するoneshot systemdサービスを使用することがここで提案されています。

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

2
janosi