Не удается получить горячую перезагрузку веб-пакета с помощью приложения create-реагировать и окон докера

Мы собираемся разработать реактивный pwa с помощью dockersetup и опубликовать приложение на страницах gitlab во время развертывания в основной ветке.

Я работаю на устройстве Windows и не могу получить функцию горячей перезагрузки в режиме разработки. Всякий раз, когда я делаю какие-либо изменения, код не перекомпилируется. Я должен docker-compose up --build каждый раз для каждого изменения.

Есть ли способ заставить горячую перезагрузку работать на установке windows/docker/create-react-app?

После package.json:

 {
  "name": "Appname",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.7.0",
    "react-dom": "^16.7.0",
    "react-scripts": "2.1.1"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "buildandserver": "react-scripts build && serve -s build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": [
    ">0.2%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ]
}

Теперь Dockerfile для Dev-Setup:

FROM node:9.6.1
# set working directory
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
# add `/usr/src/app/node_modules/.bin` to $PATH
ENV PATH /usr/src/app/node_modules/.bin:$PATH
# install and cache app dependencies
COPY package.json /usr/src/app/package.json
RUN npm install
RUN npm install [email protected] -g
# start app
CMD ["npm", "start"]

И хотя бы docker-compose для dev-setup:

version: '3.5'

services:

  App-Name:
    container_name: App-Name
    build:
      context: .
      dockerfile: devsetup/Dockerfile
    volumes:
      - './:/usr/src/app'
      - '/usr/src/app/node_modules'
    ports:
      - '3000:3000'
    environment:
      - NODE_ENV=development

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


person Alex    schedule 27.12.2018    source источник
comment
Вы должны добавить command в свою службу docker-compose под App-Name, чтобы при каждом запуске докера у вас работал npm start. npm start — это тот, кто запускает сервер разработки и ждет изменений. так что вам нужно сделать docker-compose up один раз и готово.   -  person Panther    schedule 27.12.2018
comment
я добавил command: "npm start" прямо под container_name: App-Name, но он все еще не компилируется, когда я что-то меняю. Я также новичок в docker/docker-compose. Мы проектная группа, и я не устанавливал докеры. Тот, кто это сделал, работает с mac/linux :)   -  person Alex    schedule 27.12.2018
comment
У меня также была такая проблема с dockerproject angularcli. Чтобы решить эту проблему, я использовал dockerstart": "npm install; ng serve --host 0.0.0.0 --poll=1000 в своем файле package.json. Может быть, есть похожее решение моей проблемы с реакцией   -  person Alex    schedule 27.12.2018
comment
Похоже, виноват тот file change events are not getting notified inside the docker, что devserver никогда не знает, когда перекомпилировать. Попробуйте добавить poll: true к webpack config, как описано в webpack.js.org/configuration/watch. Это может помочь вам. Также сохраните команду npm start в docker-compse, чтобы вам не приходилось каждый раз создавать контейнер.   -  person Panther    schedule 27.12.2018
comment
с dockerfile все мои node_modules монтируются только в dockerenvironment, у меня нет к нему локального доступа с моей настройкой. У вас есть идеи, как я могу изменить конфигурацию веб-пакета, потому что они находятся в папке node_modules?   -  person Alex    schedule 27.12.2018
comment
Исправлено, изменив startscript в package.json на "start": "CHOKIDAR_USEPOLLING=true react-scripts start",   -  person Alex    schedule 27.12.2018


Ответы (1)


Проблема в основном вызвана тем, что вы используете Windows.

Почему?

Потому что Docker в Windows плохо работает с томами. Если быть точнее — не уведомляет контейнер об изменении объема. Он предоставляет обновленные файлы в контейнере, но Linux внутри контейнера «не знает» о том факте, что файл был изменен, что необходимо для запуска перекомпиляции веб-пакета.

Решений немного:

  1. Переключитесь на Linux для разработки (я знаю, что это может быть невозможно, но если вы много работаете с докером и можете двигаться — сделайте это. Контейнеры Linux в Linux работают намного быстрее, нет проблем с томами и т. д.)
  2. Если вы не можете, вы можете использовать устаревший опрос в веб-сайте, который уже упоминается в комментариях.
  3. Вы можете использовать, например. https://github.com/merofeev/docker-windows-volume-watcher это инструмент на основе Python, который просматривает ваши локальные файлы и файлы контейнеров внутри томов и уведомляет контейнер об изменении...

Я обнаружил, что 3 работают немного лучше, чем 2, но у обоих будет некоторая потеря производительности.

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

person Marek Urbanowicz    schedule 27.12.2018
comment
С недавнего времени события файловой системы должны работать, даже если на вашем хост-компьютере установлена ​​Windows: docs.docker.com/docker-for-windows/release-notes/ (ищите inotify). - person Juliusz Gonera; 30.01.2020