Запуск сервера разработки с приложением create-реагировать внутри док-контейнера

Я пытаюсь запустить сервер разработки приложения create-реагировать внутри док-контейнера и заставить его перекомпилировать и отправить измененный код приложения клиенту для целей разработки, но он не улавливает изменения внутри док-контейнера .

(Конечно, у меня есть рабочий каталог приложения в качестве тома для контейнера.)

Есть ли способ сделать эту работу?


person hwkd    schedule 20.06.2017    source источник
comment
Если вы запускаете что-то вроде docker run -it --rm -v ${PWD}:/app -v /app/node_modules -p 3001:3000 -e CHOKIDAR_USEPOLLING=true sample:dev, убедитесь, что вы используете powershell и интерполяция переменных работает (часть с ${}). Я работал с git bash, и он создавал какую-то странную папку, и перезагрузка в реальном времени не работала. Переключение на powershell устранило проблемы.   -  person Mindaugas Bernatavičius    schedule 30.11.2020


Ответы (4)


На самом деле я нашел ответ здесь. По-видимому, приложение create-react-app использует chokidar для отслеживания изменений файлов, и у него есть флаг CHOKIDAR_USEPOLLING, чтобы вместо этого использовать опрос для отслеживания изменений файлов. Так что CHOKIDAR_USEPOLLING=true npm start должен решить проблему. Что касается меня, я установил CHOKIDAR_USEPOLLING=true в своей переменной среды для контейнера докеров и просто запустил контейнер.

person hwkd    schedule 20.06.2017
comment
Это исправляет, но есть значительная задержка для горячей перезагрузки, и использование моего процессора было выше 60% - person Azraar Azward; 11.11.2018
comment
Да, я согласен, что это не оптимальное решение. Пожалуйста, напишите ответ, если вы нашли лучшее решение. - person hwkd; 10.01.2019
comment
Смотрите ответ, который я только что добавил. - person Juliusz Gonera; 30.01.2020
comment
У меня сработало создание файла .env с CHOKIDAR_USEPOLLING=true (см. stackoverflow.com/a/43281575/470749 и create-react-app.dev/docs/troubleshooting и stackoverflow.com/a/57691204/470749 ) - person Ryan; 10.04.2020
comment
Вы можете настроить веб-пакет для использования опроса и игнорирования node_modules во время просмотра. Это решает проблему с процессором. См. ответ для Vue (должен быть аналогичен для React): stackoverflow.com/a/67209565/3233827 - person ssc-hrep3; 22.04.2021

Опрос, предложенный в другом ответе, приведет к гораздо более высокой загрузке ЦП и быстрой разрядке аккумулятора. Вам не нужно CHOKIDAR_USEPOLLING=true, так как события файловой системы должны передаваться в контейнер. С недавнего времени это должно работать, даже если на вашем хост-компьютере установлена ​​Windows: https://docs.docker.com/docker-for-windows/release-notes/#docker-desktop-community-2200 (ищите "inotify").

Однако при использовании Docker для Mac этот механизм иногда дает сбой: https://github.com/docker/for-mac/issues/2417#issuecomment-462432314

В моем случае помогает перезапуск демона Docker.

person Juliusz Gonera    schedule 29.01.2020

Если ваши изменения не принимаются, вероятно, это проблема с механизмом просмотра файлов. Обходной путь для этой проблемы — настроить опрос. Вы можете сделать это глобально, как описано в @Javascriptonian, но вы также можете сделать это локально с помощью конфигурации веб-пакета. Преимущество этого заключается в указании игнорируемых папок (например, node_modules), которые замедляют процесс наблюдения (и приводят к высокой загрузке ЦП) при использовании опроса.

В конфигурацию вашего веб-пакета добавьте следующую конфигурацию:

devServer: {
  watchOptions: {
    poll: true, // or use an integer for a check every x milliseconds, e.g. poll: 1000
    ignored: /node_modules/ // otherwise it takes a lot of time to refresh
  }
}

источник: документация webpack watchOptions


Если у вас возникла та же проблема с nodemon во внутреннем проекте Node.js, вы можете использовать флаг --legacy-watch (сокращение -L), который также запускает опрос.

npm exec nodemon -- --legacy-watch --watch src src/main.js

или в package.json:

"scripts": {
  "serve": "nodemon --legacy-watch --watch src src/main.js"
}

документация: nodemon legacy watch

person ssc-hrep3    schedule 22.04.2021

Если вы используете Linux, вам не нужно использовать CHOKIDAR_USEPOLLING=true

person Sakil Mahmud    schedule 02.07.2021