systemd Dockerコンテナーで環境変数を継承する


9

systemdを実行しているDockerコンテナーがあります。その下のアプリケーションに環境変数を渡したいのですが。

Docker内から(/sbin/initコマンドラインとして)systemdを起動すると、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リポジトリを参照してください。

回答:


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


3
「この機能は必要ない、環境変数が必要だ」と言いたい
Daniel Dai

2

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

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

ここでは、「最終」サービスのEnvironmentFileを構成するoneshot systemdサービスを使用することをお勧めします。

/programming/25396167/how-do-i-get-etcd-values-into-my-systemd-service-on-coreos


1
また、確認することを検討してくださいPassEnvironment=。docker systemd環境で私を助けました。
FelikZ 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.