package.json не найден при переходе из Dockerfile в docker-compose

#node.js #reactjs #docker #docker-compose

#node.js #reactjs #docker #docker-compose

Вопрос:

Я знакомлюсь с React и создал небольшое приложение, используя Create-React-App , которое запускается внутри контейнера docker, используя следующий dockerfile:

 FROM node:latest

WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install app dependencies
COPY package.json ./
COPY package-lock.json ./
RUN npm install --silent
RUN npm install -g react-scripts@3.4.1 -g --silent

#add app to container
COPY . ./
CMD ["npm", "start"]
  

Это работает довольно хорошо, и теперь я хотел интегрировать это в рабочий процесс docker-compose для запуска серверной части api с использованием asp.net ядро и это приложение React бок о бок:

 version: '3.7'
services:
  backend:
    asp.netcore
  db:
    sql2019linux
  ui:
    container_name: ui
    build:
      context: ./UI
      dockerfile: Dockerfile
    ports:
      - '8080:3000'
    volumes:
      - './:/app'
      - '/app/node_modules'
  

Теперь это завершается ошибкой узла:

 npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /app/package.json
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
  

Серверная часть и службы БД находятся в процессе поиска. Что именно здесь происходит и как это исправить?

Ответ №1:

Я думаю, что это может быть вашей проблемой.

 volumes:
  - './:/app'
  

Похоже, вы монтируете каталог, в котором docker-compose находятся файлы, в каталог приложения контейнера и npm start , вероятно, кричит, потому что он не может найти package.json в workdir построенном образе (который также /app есть ).

Попробуйте удалить тома.

Комментарии:

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

2. Используйте другой файл docker. Тот, в котором есть только ваша среда выполнения, т.е. node: latest, и он не перестраивает ваш код, просто запускает ваше приложение. Я бы предположил, что, вероятно, есть лучшие альтернативы, чем делать это. Если ваш вариант использования заключается в внесении изменений в ваш код. Я бы запустил свое приложение локально и предоставил любые зависимости / службы из моего файла компоновки. Если код вашего приложения находится в каталоге пользовательского интерфейса, вам, вероятно, придется монтировать ./UI:/app

3. Изменение workdir на /usr/src/app , а затем сопоставление тома с ./usr/src/app:/app , делает трюк, но горячая перезагрузка еще не работает.

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

5. create-react-app Делает это ootb — я только в начале своего пути и еще не заглядывал под капот слишком внимательно, поэтому я не могу дать вам четкий ответ на этот вопрос.