在systemd服务文件中访问docker环境变量时遇到的问题

时间:2018-09-29 19:01:58

标签: docker ubuntu-16.04 systemd

1)我正在使用以下cmd运行docker容器(通过-e选项传递几个环境变量)

$ docker run --name=xyz -d -e CONTAINER_NAME=xyz -e SSH_PORT=22 -e NWMODE=HOST -e XDG_RUNTIME_DIR=/run/user/0 --net=host -v /mnt:/mnt -v /dev:/dev -v /etc/sysconfig/network-scripts:/etc/sysconfig/network-scripts -v /:/hostroot/ -v /etc/hostname:/etc/host_hostname -v /etc/localtime:/etc/localtime -v /var/run/docker.sock:/var/run/docker.sock --privileged=true cf3681e04bfb

2)如上运行容器后,我检查了容器内的env变量NWMODE,它如下所示正确显示:

$ docker exec -it xyz bash $ env | grep NWMODE NWMODE=HOST

3)现在,我创建了一个示例服务'b',如下所示,该服务执行脚本b.sh(在这里我尝试访问NWMODE):

root@ubuntu16:/etc/systemd/system# cat b.service
[Unit]
Description=testing service b

[Service]
ExecStart=/bin/bash /etc/systemd/system/b.sh

root@ubuntu16:/etc/systemd/system# cat b.sh
#!/bin/bash`
systemctl import-environment
echo "NWMODE:" $NWMODE`

4)现在,如果我启动服务“ b”并查看其日志,则表明它无法访问NWMODE环境变量

$ systemctl start b
$ journalctl -fu b
...
systemd[1]: Started testing service b.
bash[641]: NWMODE:      //blank for $NWMODE here`

5)现在,而不是在b.sh中具有“ systemctl import-environment”,如果我按照以下说明进行操作,则b.service日志将显示NWMODE env变量的正确值: $ systemctl import-environment $ systemctl start b

尽管上述第5步有效,但我不能这样做,因为系统中的所有服务都将由systemd自动启动。在这种情况下,任何人都可以让我知道如何访问服务文件中的环境变量(使用上面的“ docker run ...” cmd传递)(例如,如上面的b.sh中所述)。可以通过systemctl import-environment或其他方式实现此目的吗?

1 个答案:

答案 0 :(得分:0)

systemd取消设置所有环境变量以提供一个干净的环境。旨在成为安全功能的Afaik。

解决方法:创建文件/etc/systemd/system.conf.d/myenvironment.conf

[Manager]
DefaultEnvironment=CONTAINER_NAME=xyz NWMODE=HOST XDG_RUNTIME_DIR=/run/user/0

systemd将设置在此文件中声明的环境变量。

您可以设置一个ENTRYPOINT脚本,该脚本在运行systemd之前自动创建此文件。示例:

RUN echo '#! /bin/bash \n\
echo "[Manager] \n\
DefaultEnvironment=$(while read -r Line; do echo -n "$Line" ; done < <(env) \n\
" >/etc/systemd/system.conf.d/myenvironment.conf \n\
exec /lib/systemd/systemd \n\
' >/usr/local/bin/setmyenv && chmod +x /usr/bin/setmyenv

ENTRYPOINT /usr/bin/setmyenv

您可以将其存储在外部并用Dockerfile添加,而不是在COPY中创建脚本:

#! /bin/bash
echo "[Manager]
DefaultEnvironment=$(while read -r Line; do echo -n "$Line" ; done < <(env)
" >/etc/systemd/system.conf.d/myenvironment.conf
exec /lib/systemd/systemd