将唯一的硬件标识符传递给Docker容器

时间:2018-02-06 12:43:46

标签: python docker

我想从主机获取特定于硬件的信息到docker容器中。

我有2个Docker网络应用clientserver部署到Docker群。我将server部署为连接到数据库的单个容器,并将client作为复制服务部署到集群中的每个工作节点。 client将数据发送回serverserver保留一个表数据库,用于跟踪从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应用程序中的环境变量。

this solution

docker run --rm -v $(pwd)/mybashscript.sh:/mybashscript.sh ubuntu bash /mybashscript.sh

每个解决方案都单独运行容器。我使用的是单个经理的docker-composedocker stack deploy。因此,我不想假设每个主机(工作节点)上已存在脚本文件。

我最后想到将容器中的文件“SCPI-ing”到主机,然后从容器到主机“SSH-ing”,执行脚本并捕获输出。但是,我还没有找到这个的语法。类似的东西:

scp mac_address.sh user@host_hostname:
max=$(ssh user@host_hostname "mac_address.sh")

我不关心唯一标识符是MAC地址还是其他标识符;但是,基本上我希望这个唯一的标识符能够持久存在,即使容器出现故障并且出现了新的容器。

有没有人做过类似的事情?

1 个答案:

答案 0 :(得分:0)

我不相信这是最好用的"唯一ID"。您已经声明要有目的地重复使用该ID,因此请务必将其称为" unique "。

我确定你知道,你需要小心这种方法 - 如果你要在物理机器上运行两个实例,他们会认定为#34;同样的&#34 ;节点

我也不能强调这一点: 使用此标识符进行任何身份验证。这包括将报告的数据归因于特定节点/设备/用户。我希望从您的系统中检索信息需要适当的身份验证。

如果您打算使用此" 唯一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