我目前正在尝试为 Docker 容器中名为 FlexNET 的许可引擎创建一个受信任的文件存储,问题是许可引擎要求我有一个持久的 UUID、VMID 和 MAC 地址。
我已经找到了如何设置容器的 MAC 地址。但我无法设置 docker 容器的 UUID 和 VMID。
据我所知,许可引擎从以下位置读取 UUID:
/sys/class/dmi/id/product_uuid
它与内核相连,因此不能直接修改。
所以我的问题是:有没有办法从 Docker 修改此文件的内容,而无需重建主机操作系统内核?
答案1
product_uuid
如果我正确理解了你的问题,我可以想到两种改变的方法。
通过 product_uuid 进行安装
您可以将主机上的文件绑定到容器中的该路径。因此,在读取该路径时,它将读取已挂载的文件,而不是调用 sysfs。
例如:
$ echo "new-uuid" > /var/tmp/product_uuid
$ docker run --rm -ti -v /var/tmp/product_uuid:/sys/class/dmi/id/product_uuid centos bash
[root@217e12a74e74 /]# cat /sys/class/dmi/id/product_uuid
new-uuid
镜像内的 chroot
如果您不想在文件中挂载,并且希望将其完全包含在容器内,另一种方法是在构建图像时使用 chroot。
下面是一个示例 Dockerfile,它在内部设置了一个 shell chroot
:
FROM centos:7
RUN mkdir -p /chroot /chroot/sys/class/dmi/id \
&& cp -al /lib /lib64/ /usr/ chroot/ || echo "Ignoring linking issues ..." \
&& echo "new-uuid" > /chroot/sys/class/dmi/id/product_uuid
CMD chroot /chroot sh
当我们启动它时,它将默认在我们的 chroot 内启动一个 shell:
$ docker run -ti --rm uuid-test
sh-4.2# cat /sys/class/dmi/id/product_uuid
new-uuid
对于您的用例,您还需要将应用程序及其依赖项添加到chroot
,并将其替换sh
为应用程序启动命令。还请注意,这意味着/sys/
将仅有的包含文件/sys/class/dmi/id/product_uuid
。
其他方法?
我首先想到的是我不确定还有其他直接的方法可以做到这一点,因为 docker 总是会将 sysfs 挂载到/sys
- 除非你/sys
在 Dockerfile 中将其指定为 VOLUME,但我认为这在这里没有帮助。