【发布时间】:2019-03-05 09:50:51
【问题描述】:
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) 如上运行容器后,我检查容器内的环境变量 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 以某种方式实现吗?还是有其他方法?
【问题讨论】:
-
您确定在设置环境变量之前您的服务没有启动吗?我敢打赌它是。如果是这种情况,您需要为 systemd 创建一些依赖项,以便它在适当的时间启动。
-
@mrunion :在我运行
docker run...cmd 的那一刻设置环境变量。在上面的示例中,我正在尝试手动运行该服务。甚至在手动运行服务之前,我已经在上面展示了 env 变量存在。
标签: docker ubuntu-16.04 systemd