Docker Создайте node_modules в контейнере пустым после изменения файла - PullRequest
2 голосов
/ 04 апреля 2019

Я пытаюсь запустить Node.js в контейнере Docker через Docker Compose. node_modules должен быть создан в образе, а исходный код должен быть синхронизирован с хоста.

Поэтому я использую 2 тома в docker-compose.yml. Один для моего проекта источника и другой для node_modules в изображении.

Кажется, все работает. node_modules установлены и nodemon запускает приложение. В моем Docker-контейнере у меня есть папка node_modules со всеми зависимостями. На моем хосте создается пустой node_modules (я не уверен, ожидается ли это).

Но, когда я меняю файл из проекта. Процесс nodemon обнаруживает изменение файла и перезапускает приложение. Теперь приложение вылетает, потому что не может найти модули. Папка node_modules в контейнере Docker теперь пуста.

Что я делаю не так?

Структура моей папки выглядит следующим образом

/
├── docker-compose.yml
├── project/
│   ├── package.json
│   ├── Dockerfile

докер-compose.yml

version: '3'
services:
  app:
    build: ./project
    volumes:
      - ./project/:/app/
      - /app/node_modules/

Проект / Dockerfile

# base image
FROM node:9

ENV APP_ROOT /app

# set working directory
RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT

# install and cache app dependencies
COPY package.json $APP_ROOT
COPY package-lock.json $APP_ROOT
RUN npm install

# add app
COPY . $APP_ROOT

# start app
CMD ["npm", "run", "start"]

проект / package.json

...
"scripts": {
    "start": "nodemon index.js"
}
...

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Вы можете использовать любое из этих двух решений:

  • npm install на хосте и создать том, который может использовать контейнер и который ссылается на папку хоста node_modules.
  • Используйте npm install в процессе сборки образа / контейнера - это может быть проблемой для настройки разработки, поскольку оно будет npm i при каждом перезапуске контейнера (если вы измените некоторые файлы).
0 голосов
/ 04 апреля 2019

Отображение тома работает, чтобы сделать файлы доступными для контейнера, а не наоборот.

Вы можете решить эту проблему, запустив «npm install» как часть CMD. Вы можете достичь этого, запустив скрипт запуска (например, start.sh), который запускает npm install && npm run start. Сценарий должен быть скопирован в контейнер с помощью обычной команды COPY и должен быть исполняемым.

Когда вы запускаете свой контейнер, вы должны видеть файлы в папке node_modules (на хосте).

...