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
}