有没有办法自定义 Docker 机器的 UUID 和 VMID

有没有办法自定义 Docker 机器的 UUID 和 VMID

我目前正在尝试为 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,但我认为这在这里没有帮助。

相关内容