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
或其他方式实现此目的吗?
答案 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