Environment-Variables
在 systemd Docker 容器中繼承環境變數
我有一個執行 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 的另一個“功能”,他們不認為這是一個錯誤。