Quando falamos de namespaces do Linux, na verdade estamos falando de vários espaços de nomes diferentes , os quais podem ser configurados separadamente:
- IDs de processo
- Memória compartilhada
- Rede
- Nome do host, etc
- IDs de usuário
- Sistema de arquivos
Quando um processo chama setns()
ou clone()
com os flags certos, um novo namespace é gerado com uma visão "falsa" do mundo.
Agora, isso pode causar problemas se quisermos mesclá-los novamente.
Vamos usar o namespace "ID do processo" porque é fácil.
Quando você cria um novo namespace PID, o primeiro processo obtém um PID de 1 dentro desse namespace. Se você tem dois novos namespaces, então você tem dois processos que pensam que são PID 1. Se você quiser mesclá-los, então você tem um conflito; apenas um deles pode manter o PID 1, você terá que alterar o PID do processo em execução inesperadamente. Isso pode ter consequências inesperadas.
Da mesma forma com o IPC; dois trechos separados de memória compartilhada poderiam ter o mesmo endereço dentro de seus respectivos namespaces; se tentarmos mesclá-los, veremos a corrupção da memória (mesmo se você alterasse o endereço de um segmento, os processos ainda teriam o endereço antigo).
Portanto, a fusão de dois namespaces existentes é perigosa.
O que os docker
patches fazem é impedir que um novo namespace seja criado quando o container é inicializado. Isso é diferente de mesclar dois contêineres existentes; isso acontece no momento da partida do contêiner.