Existe uma maneira de personalizar o UUID e o VMID da máquina do Docker?

2

No momento, estou tentando criar um armazenamento confiável de arquivos para um mecanismo de licenciamento chamado FlexNET em um contêiner Docker, o problema é que o mecanismo de licenciamento exige que eu tenha um UUID, VMID e um endereço MAC persistentes.

Eu encontrei como definir o endereço MAC do contêiner. Mas tenho problemas para configurar o UUID e o VMID do contêiner docker.

Até onde eu vejo, o mecanismo de licenciamento lê o UUID de:

/sys/class/dmi/id/product_uuid 

O qual está ligado ao kernel e, portanto, não pode ser modificado diretamente.

Então, minha pergunta é: Existe uma maneira de modificar o conteúdo deste arquivo do Docker sem ter que reconstruir o kernel do sistema operacional host?

    
por M.Benkov 12.02.2018 / 10:05

1 resposta

0

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.

    
por 14.02.2018 / 02:01

Tags