Невозможно запустить интерфейс реагирования внутри контейнера докеров, получая ошибку Неперехваченная среда выполнения

Я установил контейнер Ubuntu LXC на Proxmox и внутри этого контейнера настроил Docker и Portainer. В Docker я работаю над проектами Node.js (бэкэнд) и React.js (интерфейс). Хотя проект хорошо работает за пределами Docker, я сталкиваюсь с ошибками при попытке настроить весь стек внутри Docker. Серверная часть работает без проблем. Почему у меня могут возникнуть трудности с подключением к серверной части в Docker? У меня есть файл с именем dev-proxy.js, который мне нужно выполнить, чтобы установить соединение с серверной частью. Впоследствии я запускаю npm start для запуска проекта. Я не знаю, как включить обе эти команды в Dockerfile, чтобы обеспечить правильное выполнение. Я пробовал разные конфигурации: иногда серверная часть подключается, а внешний интерфейс не работает, иногда наоборот.

Dockerfile для фронтенда

FROM node:18.19.0

# Set the working directory
WORKDIR /opt/my-project/

# Copy package.json and package-lock.json (if exists)
COPY package*.json ./

# Install dependencies
RUN yarn

# Copy the rest of the application code
COPY . .

# Run proxy-dev script
CMD ["sh", "-c", "node dev-proxy.js && npm start"]

Ответ на вкладке «Сеть» браузера

Request URL:
http://192.168.61.112:3000/undefined/Controllers/Login.ashx
Request Method:
GET
Status Code:
500 Internal Server Error
Remote Address:
192.168.61.112:3000
Referrer Policy:
strict-origin-when-cross-origin

Как я обычно запускаю интерфейс локально (рабочий метод) без Docker

git pull my-git-url

yarn

node dev-proxy.js

# Then, in another terminal window

npm start

Как настроить подключение API и запустить проект из файла Docker? или Могу ли я использовать NGINX?

🤔 А знаете ли вы, что...
React обеспечивает высокую производительность благодаря эффективной обработке изменений DOM.


1
81
1

Ответ:

Решено

Если обычно вы запускаете команды в двух отдельных окнах терминала, то в Docker вы обычно запускаете их в двух отдельных контейнерах. Когда вы запускаете контейнер, вы можете переопределить CMD изображения, чтобы использовать его для запуска двух контейнеров с альтернативными командами.

В Dockerfile выберите один или другой параметр по умолчанию CMD

CMD ["npm", "start"]

Если вы запускаете это в Compose, для двух контейнеров используйте одну и ту же строку build: или image:. Если это build:, Compose дважды повторит механизм создания изображения, но второе изображение будет полностью получено из кэша и запустится быстро, и вы получите два сгенерированных имени для одного и того же базового изображения. Затем переопределите command: по мере необходимости.

services:
  backend: { ... }
  frontend:
    build: ./frontend
    ports: ['3000:3000']
  proxy:
    build: ./frontend
    command: node dev-proxy.js