#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 — я только в начале своего пути и еще не заглядывал под капот слишком внимательно, поэтому я не могу дать вам четкий ответ на этот вопрос.