Saltar al contenido

ng serve no funciona en el contenedor Docker

Es imprescindible entender el código de forma correcta antes de utilizarlo a tu proyecto y si ttienes algo que aportar puedes comentarlo.

Solución:

En su Dockerfile, le falta la línea Expose, como:

EXPOSE 4200

Intente colocarlo antes de su último comando EJECUTAR en el archivo acoplable.

Esta línea expone el puerto en el propio contenedor (4200 en este caso) para que la asignación de compuse funcione (80:4200).

Compose solo hace esto: reenvía 80 desde el host a 4200 en el contenedor. Pero no sabe ni le importa si el 4200 realmente está siendo escuchado. El Expose en el dockerfile se asegura de que, cuando se crea la imagen, se exponga este puerto para futuros contenedores en ejecución, de modo que su servicio ng pueda escucharlo.


Resolución

Así que para conseguir lo que quieres con docker-compose runusar publish para publicar los puertos. Como run no utiliza las asignaciones de su docker-compose.yml, los ignora. Así que úsalo así:

docker-compose run --publish 80:4200 node bash

Luego cree la aplicación angular e iníciela como lo estaba haciendo.


Ejemplo de prueba para referencia futura

cd tmp (o cualquier carpeta de escritura)

ng new myProject

cd myProject

ng serve --host 0.0.0.0 (–host 0.0.0.0 para escuchar todas las interfaces del contenedor)

Luego, en su navegador, vaya a localhost y debería ver la página de bienvenida angular ahora como el puerto 4200 se publica y se une al puerto de host 80 a través del comando de publicación como mostré arriba.

Cada vez que tiene problemas de reenvío de puertos, si abre una nueva terminal manteniendo la otra terminal donde ejecutó la original run command y correr docker ps verá esto en la columna Puertos:

0.0.0.0:80->4200/tcp lo que significa que su host en el puerto 80 se está reenviando a su contenedor en el puerto 4200 con éxito.

Si ves algo como 4200/tcp y no el -> parte, eso significa que no hay asignaciones o puertos publicados.

intenta correr ng serve con host especificado (que está configurado en ‘localhost’ de forma predeterminada):

ng serve -H 0.0.0.0

ACTUALIZAR
Presta atención, actualmente (@angular/[email protected]) la opción es --host:

ng serve --host 0.0.0.0

Utilizando ng serve --host 0.0.0.0 siempre me ha funcionado.

La razón por la que esto es crucial es que sin él, el proceso angular solo escucha en la interfaz localhost dentro del contenedor – por lo tanto, incluso con la asignación de puertos de la ventana acoplable, no se reciben conexiones desde fuera del contenedor.

** Angular Live Development Server está escuchando en localhost:3000

Pero si agregas el parámetro --host 0.0.0.0 luego, el proceso angular escuchará en todas las interfaces, y el mapeo del puerto acoplable permitirá que las conexiones desde fuera del contenedor lo alcancen.

** Angular Live Development Server está escuchando en 0.0.0.0:3000

Entonces, en resumen:

  1. usted no necesita el EXPOSE 4200 línea en el Dockerfile
  2. usted hacer necesita la asignación de puertos en el archivo docker-compose.yml
  3. usted hacer necesita la línea CMD en el Dockerfile, y debe incluir el parámetro de host, por ejemplo
    CMD ["ng","serve","--host", "0.0.0.0"]
  4. usted no necesitará usar docker run
  5. usted puede usar docker-compose upque recogerá las asignaciones de puertos del archivo docker-compose.yml.

Puedes reafirmar nuestro ensayo añadiendo un comentario o valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *