#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 остаются отсутствующими.