Mot*_*tys 10 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
Run Code Online (Sandbox Code Playgroud)
我希望VAR1=1在运行我的命令时看到。
换句话说,systemd 可以将传递给它的变量传递给它启动的孩子吗?
对于 Dockerfile,请参阅github 存储库。
小智 11
回答提出的问题(因为似乎在其他任何地方都没有回答)
“如何将传递给 /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
Run Code Online (Sandbox Code Playgroud)
这将读取 /proc/1/envion,这是赋予 PID 1 的环境,但由空值分隔。它使用“tr”用新行替换空值,然后迭代这些行并使用前置的“导出”对它们进行评估,因此它们对子进程可见。
不暴露环境变量是 systemd 的另一个“特性”,他们不认为这是一个错误。