При запуске углового приложения nodejs в докере он возвращает ошибку

Я пытаюсь настроить poc для докера с помощью одного простого проекта. Он включает в себя angular, express, nodejs и атлас mongodb.

angular работает на 4200 и nodejs 3000

https://github.com/changan1111/UserManagement

он отлично работает в локальной той же настройке ..

Когда я иду на докер?

Я вижу, что узел js запущен и работает.

Когда я вижу список файлов, я вижу все хорошо.

Когда я перехожу к http://localhsot/user, он возвращает значения

Но когда я читаю значение из браузера, оно показывает

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

app.use(cors());

/*
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "req.headers.origin"); // update to match the domain you will make the request from
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.header("Access-Control-Allow-Methods", "DELETE,PUT,GET,POST");

  next();
});*/


/*
app.use(cors({
  "origin": ['http://localhost:3000'],
  "methods": "GET,PUT,POST",
  "preflightContinue": false,
   "credentials": true
}));*/

пробовал с IP-адресом http://192.168.0.103/, но без изменений Докерфайл:

Во-первых, вы должны поставить EXPOSE перед CMD в вашем Dockerfile.

Slava Kuravsky 19.10.2022 14:52

это ошибка копирования и вставки при выполнении .. EXPOSE был указан до CMD

ChanGan 19.10.2022 15:20

Пожалуйста, замените изображения кода реальным кодом.

akop 19.10.2022 17:32

В вашем браузере вы звоните localhost:3000/user, а не localhost/user. И ваша проблема в том, что ваше приложение каким-то образом доступно на 80 вместо 3000?

akop 19.10.2022 17:43

Соответствует ли ваш отображаемый порт (тот, который вы можете попытаться подключить извне) открытому порту? Обычно вы хотите указать порт при запуске контейнера с некоторыми портами, открытыми в нем.

Sergey 19.10.2022 21:53

P.S. Ваш Angular не должен работать ни на одном порту. Он должен быть построен и обслуживаться на статическом сервере, таком как nginx.

Sergey 19.10.2022 21:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
224
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В вашем вопросе неясно, но, судя по предоставленным вами изображениям, кажется, что ваше приложение Angular не может получить доступ к серверной части Express в 127.0.0.1.

Вы настроили http://localhost:3000 в качестве конечной точки API, но имейте в виду, что с точки зрения Docker localhost относится к самому контейнеру и может не совпадать с вашим фактическим хостом.

Чтобы решить проблему, вы можете указать Express, что он должен прослушивать в каждом сетевом интерфейсе, используя 0.0.0.0:

app.listen(3000, '0.0.0.0', () => {
  console.info("listening on PORT verify: 3000");
});

Решение также проиллюстрировано в документации руководства по nodejs.

Кроме того, попробуйте настроить переменную Url в ваших environment файлах на адрес http://localhost, не указывая порт, т.е. используя порт 80: судя по коду, который вы загрузили в свой репозиторий на Github, ваше приложение, похоже, слушает порт 3000, но на ваших скриншотах вы точно используете порт 80. Причина этого заключается в том, что если express обслуживает как ваш Angular SPA, так и ваш API, и вы можете связаться с обеими вещами с вашего хоста, используя http://localhost/read и http://localhost/user соответственно, то, вероятно, настраивая вашу переменную Url на http://localhost, как рекомендуется, может сделать обманывать.

Я изменил app.listen(3000, '0.0.0.0', () => { console.info("прослушивание PORT: 3000"); }); Но все же я не увидел никакой разницы в поведении

ChanGan 20.10.2022 13:50

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES 731365201d70 106d "node server" 8 минут назад Up 8 минут 0.0.0.0:80->3000/tcp cranky_pasteur Я попробовал localhost и использовал ip с хостов в браузере (# Добавлено Docker Desktop 192.168 .0.106 host.docker.internal 192.168.0.106 gateway.docker.internal)

ChanGan 20.10.2022 13:58

Можете ли вы, пожалуйста, дайте мне знать какие-либо другие необходимые детали?

ChanGan 20.10.2022 14:48

Привет @ChanGan. Мне жаль слышать, что это не сработало должным образом. Вы все еще сталкиваетесь с той же проблемой? Точно такая же проблема? Поскольку вы используете Express как для выходных данных Angular, так и для API, вы можете попробовать использовать относительные маршруты в своем apiservice.service. Я имею в виду, что переменная env Url может быть определена как пустая строка в вашей среде. Возможно, этот альтернативный подход мог бы помочь. В идеале ваш SPA должен обслуживаться каким-либо веб-сервером, например nginx. Этот сервер, вероятно, будет проксировать запросы, отправленные против вашего API. Я не уверен в использовании Express для этой цели

jccampanero 20.10.2022 15:12

изначально я пробовал url: "/", чтобы взять его базовый URL-адрес из источника.. но он пуст в запросе.. http:///user.. источник не добавляется в запрос. но он должен идти как http://{requestedip}/user.. так как это пусто, идет 3 косые черты

ChanGan 20.10.2022 15:17

@ChanGan Я обновил ответ дополнительными идеями. Я надеюсь, что они помогут.

jccampanero 22.10.2022 15:46

Сделал то же самое изменение и работает нормально.. принимая этот ответ

ChanGan 25.10.2022 09:10

Это здорово @ChanGan. Я рад слышать, что предложенное решение работает правильно, и вы смогли решить проблему.

jccampanero 25.10.2022 23:32

Вы пытались открыть свои порты таким образом при запуске контейнера?

docker run -p 4000:4000 container_name (при условии, что хост Linux здесь)

или просто

docker run --network = "host" container_name возможно?

Затем получите доступ через localhost:4000 из любого сервиса внутри или вне Docker.

Таким образом, внутренний localhost контейнера будет совпадать с localhost вашего фактического хост-компьютера. В этом есть некоторые недостатки, но я предполагаю, что вы не используете это в производственных условиях, поэтому это не должно иметь большого значения.

Неясно, пытаетесь ли вы получить доступ к своему Dockerized-приложению из-за пределов Docker. И ваш бэкенд, и внешний интерфейс используют один и тот же контейнер? Они оба контейнерные?

EXPOSE позволяет только внутренним приложениям Docker находить этот порт IIRC.

Вам нужно указать порты для доступа к вашему хосту.

Он открыл порты через docker-compose.

akop 20.10.2022 07:07

@akop Мой плохой. Должно быть, пропустил это, еще не особо копался в репо. В предыдущем ответе упоминалось, что путаница между портами хоста и контейнера locahost является потенциальной проблемой, поэтому я решил, что их точное сопоставление может снизить вероятность путаницы (если ОП еще не сделал этого).

Ryan Cargan 20.10.2022 07:31

Другие вопросы по теме