
Estoy creando una configuración de desarrollo para una aplicación web con Docker. Contamos con desarrolladores que ejecutan en Windows, Mac y Linux. Todo el mundo utilizará contenedores de Linux, pero todavía hay problemas que sólo afectan a los usuarios de Windows.
No busco ejecutar la aplicación de manera diferente a la producción. Más bien, son las herramientas relacionadas con la configuración del desarrollador las que deben ser diferentes.
¿Existe alguna forma de detectar el sistema operativo de un host desde un contenedor Docker?
Respuesta1
¿Realmente quieres hacer esto?
Sé que no estás contento con la respuesta a un desafío de marco, pero ten paciencia.
Los problemas a los que se enfrenta aparecen porque ejecutar Docker basado en Linux en Windows es un truco. Ciertamente puedes encontrarte con problemas con el sistema de archivos de Windows, pero puede haber otros problemas que no conozco.
Ahora, según tengo entendido, desea agregar soluciones alternativas específicas de la plataforma a su proyecto para permitir ejecutarlo en una máquina virtual en hosts de Windows. Según mi experiencia, recomendaría evitar esto.
Windows no es una plataforma de destino para su proyecto. Agregar soluciones para problemas específicos de Windows introduce una complejidad innecesaria. La complejidad innecesaria significa un mayor costo de mantenimiento y la posibilidad de que se produzcan errores que de otro modo no ocurrirían.
Es muy probable que se encuentre con más problemas causados por la incompatibilidad del sistema de archivos que no son estrictamente problemas de proyecto, pero que aún así agregan molestias innecesarias en Windows. Por ejemplo, git se desmorona cuando alguien realiza cambios en el nombre de archivo solo entre mayúsculas y minúsculas en sistemas de archivos que distinguen entre mayúsculas y minúsculas (es decir, Linux) y otra persona realiza esos cambios en una máquina con Windows.
La verdadera solución sería desarrollarse en un entorno lo más similar posible al previsto. Eso significa: en un host Linux real o en una máquina virtual Linux. Esto garantizará que los desarrolladores no pierdan tiempo (y dinero) en problemas que existen únicamente en su plataforma de desarrollo. También garantizará que no pasen por alto problemas que no se manifiestan en Windows.
A su cliente no le importa si el producto funciona bien en una máquina virtual Linux en Windows. Sus desarrolladores deben estar familiarizados con Linux de todos modos porque su objetivo es Linux como su única plataforma.¿Realmente desea gastar recursos en problemas que no existen en escenarios del mundo real?
Respuesta2
He tenido exactamente el mismo problema. Nuestro flujo de desarrollo web Angular depende de los cambios de archivos detectados con el paquete web en volúmenes mapeados.
Desafortunadamente, Windows no pasa eventos del sistema de archivos (ese fsevents
paquete que siempre advierte durante la instalación de NPM).
Respuesta3
Para macOS o cualquier sistema operativo, puede hacer que los desarrolladores configuren esto en su perfil de shell local:
export IS_HOST_MACOS='true'
export HOST_UNAME=$(uname)
Luego, pase a la ventana acoplable a través de:
docker run -e IS_HOST_MACOS -i HOST_UNAME
Por último, utilícelo dentro de algún script de la ventana acoplable:
# 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
Respuesta4
Dado que el contenedor se ejecuta en un entorno simulado, es posible que pueda distinguir entre hosts Windows y Linux según el hardware virtual suministrado.
Por ejemplo, de esta respuesta Deduzco que Docker en Windows creará un dispositivo de red llamado "vEthernet (DockerNAT)".
No tengo el entorno para realizar pruebas, por lo que depende de usted encontrar una solución que funcione para su(s) entorno(s).