Posso pensar em duas maneiras de alterar product_uuid
, se eu entendi sua pergunta corretamente.
Montagem sobre product_uuid
Você pode vincular a montagem de um arquivo do host nesse caminho no contêiner. Então, ao invés de uma chamada para o sysfs ao ler esse caminho, ele irá ler o arquivo montado.
Por exemplo:
$ 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 dentro da imagem
Se você não quiser ter que montar o arquivo e quiser que ele fique completamente contido no contêiner, outra maneira de fazer isso é com um chroot ao criar a imagem.
A seguir, um exemplo do Dockerfile que configura um shell dentro de um 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
Quando lançarmos isso, ele irá lançar um shell por padrão dentro do nosso chroot:
$ docker run -ti --rm uuid-test
sh-4.2# cat /sys/class/dmi/id/product_uuid
new-uuid
Para o seu caso de uso, você também deve adicionar seu aplicativo e suas dependências ao chroot
e também substituir sh
pelo comando de inicialização do aplicativo. Observe também que isso significa que /sys/
somente conterá o arquivo /sys/class/dmi/id/product_uuid
.
Outras maneiras?
Não tenho certeza de nenhuma outra maneira simples de fazer isso, pois a janela de encaixe sempre monta o sysfs em /sys
- a menos que você especifique /sys
como VOLUME no Dockerfile, mas eu não acho que isso vai ajudar aqui.