Docker, detecta sistema operacional do host

Docker, detecta sistema operacional do host

Estou criando uma configuração de desenvolvimento para um aplicativo web com Docker. Temos desenvolvedores rodando em Windows, Mac e Linux. Todos usarão contêineres Linux, mas ainda existem problemas que afetam apenas os usuários do Windows.

Não pretendo executar o aplicativo de maneira diferente da produção. Em vez disso, são as ferramentas da configuração do desenvolvedor que precisam ser diferentes.

Existe uma maneira de detectar o sistema operacional de um Host dentro de um contêiner Docker?

Responder1

Você realmente quer fazer isso?

Eu sei que você não está satisfeito com a resposta do desafio do quadro, mas tenha paciência comigo.

Os problemas que você está enfrentando aparecem porque executar o Docker baseado em Linux no Windows é um hack. Certamente você pode encontrar problemas no sistema de arquivos do Windows, mas pode haver outros problemas dos quais não estou ciente.

Agora, pelo que entendi, você deseja adicionar soluções alternativas específicas da plataforma ao seu projeto para permitir sua execução em uma VM em hosts Windows. Com base na minha experiência, recomendo evitar isso.

  1. O Windows não é uma plataforma de destino para o seu projeto. Adicionar soluções para problemas específicos do Windows introduz uma complexidade desnecessária. Complexidade desnecessária significa aumento do custo de manutenção e potencial para bugs que não ocorreriam de outra forma.

  2. É muito provável que você encontre mais problemas causados ​​pela incompatibilidade do sistema de arquivos, que não são estritamente problemas de projeto, mas que ainda adicionam problemas desnecessários no Windows. Por exemplo, o git desmorona quando alguém faz alterações no nome do arquivo apenas com maiúsculas e minúsculas em sistemas de arquivos com distinção entre maiúsculas e minúsculas (por exemplo, Linux) e outra pessoa transfere essas alterações para uma máquina Windows.

A verdadeira solução seria desenvolver num ambiente o mais semelhante possível ao pretendido. Isso significa - no host Linux real ou em uma VM Linux. Isto garantirá que os desenvolvedores não percam tempo (e dinheiro) com questões que existem apenas em sua plataforma de desenvolvimento. Também garantirá que não percam problemas que não se manifestam no Windows.

Seu cliente não se importa se o produto funciona bem em uma VM Linux no Windows. De qualquer maneira, seus desenvolvedores precisam estar familiarizados com o Linux, porque você está visando o Linux como sua única plataforma.Você realmente deseja gastar recursos em problemas que não existem em cenários do mundo real?

Responder2

Eu tive exatamente o mesmo problema. Nosso fluxo de desenvolvimento web Angular depende de alterações de arquivos detectadas com webpack em volumes mapeados.

Infelizmente, o Windows não passa eventos do sistema de arquivos (aquele fseventspacote que sempre avisa durante a instalação do NPM

Responder3

Para macOS ou qualquer sistema operacional, você pode fazer com que os desenvolvedores definam isso em seu perfil de shell local:

export IS_HOST_MACOS='true'
export HOST_UNAME=$(uname)

Em seguida, passe para o docker via:

docker run -e IS_HOST_MACOS -i HOST_UNAME

Por último, use-o dentro de algum script docker:

# This is meant to help developers know when the server has booted
if [ -n "${IS_HOST_MACOS+1}" ]; then
  [ "$IS_HOST_MACOS" == "true" ] && echo '{"Nginx is ready":""}';
fi

Responder4

Como o contêiner está sendo executado em um ambiente simulado, você poderá distinguir entre hosts Windows e Linux pelo hardware virtual fornecido.

Por exemplo, de esta resposta Infiro que o Docker no Windows criará um dispositivo de rede chamado "vEthernet (DockerNAT)".

Não tenho ambiente para testes, então cabe a você encontrar uma solução funcional para seu(s) ambiente(s).

informação relacionada