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
}