在systemd Docker容器中继承环境变量


9

我有一个运行systemdDocker容器。我想将环境变量传递给它下面的应用程序。

当我从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存储库

Answers:


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

这读取/ proc / 1 / envion,这是给PID 1的环境,但由空值分隔。它使用'tr'用新行替换空值,然后迭代这些行并使用前置的'export'评估它们,以便子进程可见。

not-expose-environment变量是systemd的另一个“功能”,他们不认为这是一个错误。


3
我想说“我不需要此功能,我需要环境变量”
Daniel Dai

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.