Environment-Variables

在 systemd Docker 容器中繼承環境變數

  • July 22, 2017

我有一個執行 systemd 的 Docker 容器。我想將環境變數傳遞給它下面的應用程序。

當我從 Docker(/sbin/init作為命令行)中啟動 systemd 時,Docker 將變數公開給 systemd,但不公開給子服務。如果我添加systemd.setenv=...到 cmdline,則傳遞變數。我正在尋找更清潔的解決方案。

如何將傳遞給/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 儲存庫

回答所提出的問題(因為它似乎沒有在其他任何地方得到回答)

“如何將傳遞給 /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

這讀取 /proc/1/envion,這是給 PID 1 的環境,但由空值分隔。它使用 ’tr’ 將空值替換為新行,然後遍歷這些行並使用前置的 ’export’ 對它們進行評估,因此它們對子程序可見。

不暴露環境變數是 systemd 的另一個“功能”,他們不認為這是一個錯誤。

引用自:https://unix.stackexchange.com/questions/146995