ng serve не работает в контейнере Докера

у меня есть это конфигурация компоновки Docker где я просто создаю контейнер NodeJS и устанавливаю угловой CLI внутри.

после docker-compose up -d, Я могу SSH внутри контейнера с docker-compose run node bash. ng new работает отлично, но ng serve не работает. Он запущен правильно, без ошибок в консоли. Но, если я посещу localhost (ad I сопоставил порт 4200 с 80), ничего не загружается.

Я что-то пропустила?

5 ответов


я вижу, что в вашем Dockerfile вам не хватает строки Expose: https://docs.docker.com/engine/reference/builder/#expose

попробуй:

EXPOSE 4200

в вашем Dockerfile документы здесь

Попробуйте поместить его перед последней командой запуска.

эта строка предоставляет порт в самом контейнере (4200 в этом случае), поэтому отображение из compose работает (80:4200).

Compose просто делает это: вперед 80 от хоста до 4200 в контейнере. Но он не знает или не заботится о том, действительно ли 4200 слушается. Expose в dockerfile гарантирует, когда изображение будет построено, чтобы предоставить этот порт для будущих контейнеров, чтобы ваш ng-сервис мог его слушать.

надеюсь, это поможет.

обновление, чтобы получить его решение:

так, чтобы получить то, что вы хотите с docker-compose run используйте publish для публикации портов. As run не использует сопоставления из вашего docker-compose.yml, он их игнорирует. Поэтому используйте его так:

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

затем создайте приложение angular и запустите его, как вы это делали. Я добавляю шаги для всех, кто смотрит в этот ответ в будущем:

cd tmp (или любую папку для записи)

ng new myProject

cd myProject

ng serve --host 0.0.0.0 (--host 0.0.0.0 для прослушивания всех интерфейсов из контейнер)

затем в вашем браузере, перейдите к localhost и вы должны увидеть угловую страницу приветствия теперь как порт 4200 опубликовано и привязано к порту хоста 80 через команду публикации, Как я показал выше.

каждый раз, когда у вас есть проблемы с переадресацией портов, Если вы открываете новый терминал, сохраняя другой терминал, где вы выполнили оригинал run command и работать docker ps вы увидите это в столбце порты:

0.0.0.0:80->4200/tcp что означает, что ваш хост на порту 80 успешно пересылает ваш контейнер в порт 4200.

если вы видите что-то вроде 4200/tcp, а не -> часть, это означает, что нет отображений или портов, опубликованных.


попробуйте запустить ng serve С указанным хостом (который по умолчанию установлен в "localhost"):

ng serve -H 0.0.0.0

то, что вы делаете, это просто установка углового, вам нужно иметь CMD ["npm start"] or CMD ["ng serve"] в конце dockerfile это точка входа для контейнера, который docker выполняет при запуске контейнера, и только после этого запускается сервер npm.

ng serve -H 0.0.0.0 --port <yourportnumber> заставит ngserve работать на localhost:<yourportnumber>там после того, как вы можете привязать номер порта контейнера к локальному порту


ng serve -H 0.0.0.0 

С свойством 1000 опросов в angular-cli.json (для обнаружения изменения файла)

"defaults": {
    "styleExt": "scss",
    "component": {},
    "poll": 1000
  }

С помощью ng serve --host 0.0.0.0 всегда работал для меня.