我想从主机获取特定于硬件的信息到docker容器中。
我有2个Docker网络应用client
和server
部署到Docker群。我将server
部署为连接到数据库的单个容器,并将client
作为复制服务部署到集群中的每个工作节点。 client
将数据发送回server
,server
保留一个表数据库,用于跟踪从clients
通过唯一标识符(MAC地址)发送的数据。
我在Dockerfile中启动client
python应用程序,如下所示,以便在将数据发送回server
时知道其MAC地址。
python app.py --mac-address=12345
client
目前正在使用我手动输入的硬编码mac-address
启动。我在Mac上开发,但部署到Linux机箱,因此有一些解决办法让容器可以访问主机'网络接口似乎在我的开发环境中不起作用。
理想情况下,我想从一些bash命令/脚本中输入这个值(任何唯一标识符)。我有以下脚本来捕获MAC地址:
mac=$(ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}')
echo $mac > 'mac.txt'
但是,这必须在主机上运行。
我遇到了solutions such as:
docker run -e HOST_MAC=$(ifconfig -a | grep -Po 'HWaddr \K.*$') image
然后访问python应用程序中的环境变量。
docker run --rm -v $(pwd)/mybashscript.sh:/mybashscript.sh ubuntu bash /mybashscript.sh
每个解决方案都单独运行容器。我使用的是单个经理的docker-compose
或docker stack deploy
。因此,我不想假设每个主机(工作节点)上已存在脚本文件。
我最后想到将容器中的文件“SCPI-ing”到主机,然后从容器到主机“SSH-ing”,执行脚本并捕获输出。但是,我还没有找到这个的语法。类似的东西:
scp mac_address.sh user@host_hostname:
max=$(ssh user@host_hostname "mac_address.sh")
我不关心唯一标识符是MAC地址还是其他标识符;但是,基本上我希望这个唯一的标识符能够持久存在,即使容器出现故障并且出现了新的容器。
有没有人做过类似的事情?
答案 0 :(得分:0)
我不相信这是最好用的"唯一ID"。您已经声明要有目的地重复使用该ID,因此请务必将其称为" unique "。
我确定你知道,你需要小心这种方法 - 如果你要在物理机器上运行两个实例,他们会认定为#34;同样的&#34 ;节点
我也不能强调这一点: 不使用此标识符进行任何身份验证。这包括将报告的数据归因于特定节点/设备/用户。我希望从您的系统中检索信息需要适当的身份验证。
如果您打算使用此" 唯一ID "出于上述目的,请考虑使用加密方法。
一些选项,所有选项都应具有静态分辨率。
由于sysfs
,这可能仅限于Linux,我无法评论。
$ docker run --rm -it -v /sys/class/net/enp0s31f6/address:/tmp/host_mac:ro \
ubuntu:latest bash
root@ab868434bf02:/# cat /tmp/host_mac
70:85:c2:28:fa:c2
如果您要编写Python,可以在不安装工具的情况下解决这个问题。这与虚拟接口有关,因此,如果您习惯于添加/删除虚拟网络,它可能/将会发生变化。
$ docker run --rm -it ubuntu:latest bash
root@9141327276c7:/# apt-get update && apt install -y iputils-ping net-tools
root@9141327276c7:/# HOST_IP="$(route -n | grep '^0\.0\.0\.0 ' | awk '{print $2}')"
root@9141327276c7:/# ping -c1 -w 500 ${HOST_IP} >/dev/null
root@9141327276c7:/# arp | grep "^${HOST_IP} " | awk '{print $3}'
02:42:1d:da:1c:e7