Модули узлов не найдены в Dockerfile и docker-compose из-за привязки - PullRequest
5 голосов
/ 05 июня 2019

Итак, у меня есть это экспресс-приложение NodeJS. Это код работает:

Dockerfile

FROM node:10.16-alpine
WORKDIR /app
COPY . /app
RUN npm install
CMD ["npm", "start"]

докер-compose.yml

version: "3.7"

services:
  node-express:
    build: .
    ports: 
      - 80:3000

Но для этого приложения я хочу увидеть изменения в реальном времени. Итак, я знаю, что где вы можете использовать Bind Mounts, но как только я добавлю тома вот так:

докер-compose.yml

version: "3.7"

services:
  node-express:
    build: .
    volumes: 
      - .:/app
    ports: 
      - 80:3000

Похоже, что node_modules больше не находятся в каталоге "app" .. Как я могу это исправить? Я работал над этим в течение четырех часов, и я до сих пор не могу определить ошибку!

Error

HijackManiac:webserver hijackmaniac$ docker-compose up
Creating network "webserver_default" with the default driver
Building node-express
Step 1/5 : FROM node:10.16-alpine
 ---> a298c79121d9
Step 2/5 : WORKDIR /app
 ---> Running in 9b99df0f54ba
Removing intermediate container 9b99df0f54ba
 ---> 48f9b606b32d
Step 3/5 : COPY . /app
 ---> 1f29dc735dc7
Step 4/5 : RUN npm install
 ---> Running in 81225f56a9fd
npm WARN webserver@1.0.0 No description
npm WARN webserver@1.0.0 No repository field.

added 106 packages from 130 contributors and audited 202 packages in 3.344s
found 0 vulnerabilities

Removing intermediate container 81225f56a9fd
 ---> 2985dc77bc12
Step 5/5 : CMD ["npm", "start"]
 ---> Running in 271ab42687ce
Removing intermediate container 271ab42687ce
 ---> 38a39768792e

Successfully built 38a39768792e
Successfully tagged webserver_node-express:latest
WARNING: Image for service node-express was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating webserver_node-express_1 ... done
Attaching to webserver_node-express_1
node-express_1  | 
node-express_1  | > webserver@1.0.0 start /app
node-express_1  | > node src/app.js
node-express_1  | 
node-express_1  | internal/modules/cjs/loader.js:638
node-express_1  |     throw err;
node-express_1  |     ^
node-express_1  | 
node-express_1  | Error: Cannot find module 'express'
node-express_1  |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
node-express_1  |     at Function.Module._load (internal/modules/cjs/loader.js:562:25)
node-express_1  |     at Module.require (internal/modules/cjs/loader.js:690:17)
node-express_1  |     at require (internal/modules/cjs/helpers.js:25:18)
node-express_1  |     at Object.<anonymous> (/app/src/app.js:2:17)
node-express_1  |     at Module._compile (internal/modules/cjs/loader.js:776:30)
node-express_1  |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
node-express_1  |     at Module.load (internal/modules/cjs/loader.js:653:32)
node-express_1  |     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
node-express_1  |     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
node-express_1  | npm ERR! code ELIFECYCLE
node-express_1  | npm ERR! errno 1
node-express_1  | npm ERR! webserver@1.0.0 start: `node src/app.js`
node-express_1  | npm ERR! Exit status 1
node-express_1  | npm ERR! 
node-express_1  | npm ERR! Failed at the webserver@1.0.0 start script.
node-express_1  | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
node-express_1  | npm WARN Local package.json exists, but node_modules missing, did you mean to install?
node-express_1  | 
node-express_1  | npm ERR! A complete log of this run can be found in:
node-express_1  | npm ERR!     /root/.npm/_logs/2019-06-04T23_55_20_327Z-debug.log
webserver_node-express_1 exited with code 1

Смотри рабочее дерево: enter image description here

До того, как я добавил том в docker-compose.yml, контейнер успешно работает. Это структура: enter image description here

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

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

1 голос
/ 05 июня 2019

Вам нужно либо изменить структуру проекта, переместив каждый редактируемый код в папку, скажем, src, либо обновить Dockerfile, чтобы переместить node_modules на верхний каталог.

Как мы знаем, когда Node не может найти node_modules в текущем каталоге, он начинает искать его в родительском каталоге, поэтому мы используем его.

a Dockerfile, подобный этому, решит вашу проблему.

FROM node:10.16-alpine
WORKDIR /node
COPY package.json package-lock.json ./

RUN npm install
WORKDIR /node/app
COPY . .

CMD ["npm", "start"]

Пожалуйста, не забудьте также внести соответствующие изменения в docker-compose.yml (структура каталогов изменилась)

...