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

用户111

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 env变量

$ 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还是可以通过其他方式实现?

平方米

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在systemd服务文件中从sh脚本设置环境变量

来自分类Dev

访问HOCON文件中的环境变量时,`?的作用

来自分类Dev

在macOS High Sierra的终端中设置环境变量时遇到问题

来自分类Dev

如何在Systemd服务中设置环境变量

来自分类Dev

如何在 .NET systemd 服务中设置环境变量?

来自分类Dev

无法访问 Docker 环境中的环境变量

来自分类Dev

访问IRB中的环境变量,但运行文件时不访问

来自分类Dev

使用环境变量配置 Systemd 服务

来自分类Dev

如何通过环境文件在Docker中传递环境变量?

来自分类Dev

访问 docker 入口点脚本中的环境变量

来自分类Dev

访问app.yaml文件中的环境变量

来自分类Dev

Jade文件中的访问节点环境变量

来自分类Dev

如何访问OpenFL项目xml文件中的环境变量

来自分类Dev

访问Jam配置文件中的环境变量

来自分类Dev

在构建时在Docker中创建动态环境变量

来自分类Dev

Docker从命令或文件中设置环境变量

来自分类Dev

Docker 文件中特定 RUN 命令的环境变量

来自分类Dev

如何从docker文件中获取环境变量

来自分类Dev

docker-compose使用.env文件中的环境变量

来自分类Dev

在 docker 环境中显示环境变量

来自分类Dev

在 .bashrc 文件中设置环境变量时出错

来自分类Dev

从.env文件访问Lambda环境变量

来自分类Dev

emacs 27 systemd 服务继承环境变量

来自分类Dev

将udev环境变量传递给systemd服务执行

来自分类Dev

如何为systemd服务的进程加载环境变量?

来自分类Dev

在Docker撰写文件中设置.env变量时遇到问题

来自分类Dev

在 Java 中访问子环境变量

来自分类Java

在Java中访问Shell环境变量

来自分类Dev

在Flash中访问环境变量

Related 相关文章

热门标签

归档