Узел не может найти node_modules в приложении dockerized node

#node.js #docker #docker-compose #dockerfile

#node.js #docker #docker-compose #dockerfile

Вопрос:

Я новичок в docker. Я попытался настроить свое существующее приложение узла. Во время создания docker приложение выдает ошибку, в которой говорится, что оно не может найти node_modules.

Вот ошибка

 dockerised-yelpcamp | > dockerised-yelpcamp@1.0.1 start /usr/src/app
dockerised-yelpcamp | > node app.js
dockerised-yelpcamp | 
dockerised-yelpcamp | internal/modules/cjs/loader.js:584
dockerised-yelpcamp |     throw err;
dockerised-yelpcamp |     ^
dockerised-yelpcamp | 
dockerised-yelpcamp | Error: Cannot find module 'express'
dockerised-yelpcamp |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:582:15)
dockerised-yelpcamp |     at Function.Module._load (internal/modules/cjs/loader.js:508:25)
dockerised-yelpcamp |     at Module.require (internal/modules/cjs/loader.js:637:17)
dockerised-yelpcamp |     at require (internal/modules/cjs/helpers.js:22:18)
dockerised-yelpcamp |     at Object.<anonymous> (/usr/src/app/app.js:1:77)
.
.
.
dockerised-yelpcamp |     at Function.Module._load (internal/modules/cjs/loader.js:531:3)
dockerised-yelpcamp | npm ERR! code ELIFECYCLE
dockerised-yelpcamp | npm ERR! errno 1
dockerised-yelpcamp | npm ERR! dockerised-yelpcamp@1.0.1 start: `node app.js`
dockerised-yelpcamp | npm ERR! Exit status 1
dockerised-yelpcamp | npm ERR! 
dockerised-yelpcamp | npm ERR! Failed at the dockerised-yelpcamp@1.0.1 start script.
dockerised-yelpcamp | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
dockerised-yelpcamp | npm WARN Local package.json exists, but node_modules missing, did you mean to install?
dockerised-yelpcamp | 
dockerised-yelpcamp | npm ERR! A complete log of this run can be found in:
dockerised-yelpcamp | npm ERR!     /root/.npm/_logs/2019-04-17T11_14_17_109Z-debug.log
dockerised-yelpcamp exited with code 1
 

docker-compose.yml

 version: "3"
services:
  main_app:
    container_name: dockerised-yelpcamp
    restart: always
    build: .
    ports:
      - 80:3000
    links:
      - mongo
    volumes: ["./:/usr/src/app"]
  mongo:
    container_name: mongo
    image: mongo
    ports:
      - 27017:27017
 

Dockerfile

 FROM node:10

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]
 

Мой файл docker содержит npm install , который успешно выполняется при создании образа.

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

1. ваш код находится в корневом каталоге, а не в /usr/ src/app . вы должны добавить код в /usr/src/app

Ответ №1:

Ваша volumes: директива скрывает все Dockerfile , что она делает с контентом из вашей локальной системы. Если у вас там нет node_modules каталога или его архитектура или библиотечный стек несовместимы с тем, что находится в контейнере, эта настройка просто не будет работать.

По-видимому, обычным обходным путем является объявление второго анонимного тома для хранения node_modules , который будет работать до тех пор, пока вы не измените свой package.json файл.

Я бы рекомендовал volumes: полностью удалить директиву. Разработайте свое приложение локально без Docker. Как только он заработает и вы его протестируете, используйте это Dockerfile для восстановления образа. Это дает вам более простую настройку разработки, отличную от Docker, и копирует среду, которая у вас есть в рабочей среде (где вы не собираетесь копировать код приложения в дополнение к образу Docker, который его содержит).

Ответ №2:

Вы копируете только package.json, поэтому вам нужно создать папку node_modules:

 dockerised-yelpcamp | npm WARN Local package.json exists, but node_modules missing, did you mean to install?
 

если у меня хорошая память, контейнер docker не может ответить «да» по умолчанию. Таким образом, он пропускает папку создания, а node_modules остаются отсутствующими.