我想从主机中获取硬件特定信息到docker容器。
我有2个Docker Web应用程序client
和server
被部署到Docker群。我将server
部署为连接到数据库的单个容器,然后将client
部署为群集中每个工人节点的复制服务。client
将数据发送回server
,server
保留了一个表数据库,该数据库跟踪通过唯一标识符(MAC地址(从clients
发送的数据。
我在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'
但是,这必须在主机上运行。
我遇到了:
等解决方案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
。因此,我不想假设每个主机计算机上已经存在脚本文件(Worker Node(。
我最后想到了" scpi-ing"该文件从容器中输出到主机,然后从容器到主机的" ssh-ing",执行脚本并捕获输出。但是,我还没有找到该语法。类似:
scp mac_address.sh user@host_hostname:
max=$(ssh user@host_hostname "mac_address.sh")
我不在乎唯一的标识符是MAC地址还是其他一些标识符;但是,从本质上讲,即使一个容器下降并且出现了一个新的标识符,我也希望这种唯一的标识符持续存在。
。有人做过类似的事情吗?
我不相信这是用作"唯一ID"的最好的东西。您已经说过您想有目的地重复使用ID,因此请小心将其称为" unique "。
我确定您知道,您需要小心这种方法 - 如果您要在物理机器上运行两个实例,他们将确定为"相同"节点。
我也不能充分强调它: do 不是将此标识符用于任何身份验证。这包括将报告的数据归因于特定的节点/设备/用户。我希望从您的系统中检索信息将需要适当的身份验证。
如果您打算将此" 唯一ID "用于上述目的,请考虑使用加密方法。
一些选项,所有这些都应具有静态分辨率。
将MAC地址映射到容器的VFS
中这可能是由于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
使用主机的容器端MAC地址
如果您要编写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