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

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

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

当我从 Docker 中启动 systemd(/sbin/init作为命令行)时,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 存储库

答案1

回答所提出的问题(因为其他地方似乎没有回答)

“如何将传递到 /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 的环境,但由 null 分隔。它使用“tr”用新行替换空值,然后迭代这些行并使用前置的“export”对其进行评估,以便子进程可以看到它们。

不公开环境变量是 systemd 的另一个“功能”,他们不认为这是一个错误。

答案2

根据这个描述,systemd 用户实例不会继承环境变量:

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

这里建议使用 oneshot systemd 服务为“最终”服务配置环境文件。

https://stackoverflow.com/questions/25396167/how-do-i-get-etcd-values-into-my-systemd-service-on-coreos

相关内容