I am sorry for my very newbie question, but I am having a terrible day figuring out this error, I have an Express app and I am trying to run it in docker compose. I've used this Dockerfile:
FROM mhart/alpine-node
RUN mkdir -p /usr/src/app
RUN chmod -R 777 /usr/src/app
WORKDIR /usr/src/app
RUN npm install node-gyp -g
RUN npm install nodemon -g
ENV NODE_ENV development
EXPOSE 3000
And this portion of my docker-compose file:
backend:
mem_limit: 100m
build:
context: .
dockerfile: dockerfiles/node/Dockerfile
command: npm start
depends_on:
- mongo
- elasticsearch
volumes:
- ./backend/:/usr/src/app
ports:
- 3000:3000
links:
- "mongo:mongo"
- "elasticsearch:elasticsearch"
When I do docker-compose up, I get this error:
backend_1 | npm info it worked if it ends with ok
backend_1 | npm info using npm@3.10.10
backend_1 | npm info using node@v6.9.5
backend_1 | npm info lifecycle service-designer@1.0.0~prestart: service-designer@1.0.0
backend_1 | npm info lifecycle service-designer@1.0.0~start: service-designer@1.0.0
backend_1 |
backend_1 | > service-designer@1.0.0 start /usr/src/app
backend_1 | > nodemon index.js
backend_1 |
backend_1 | [nodemon] 1.11.0
backend_1 | [nodemon] to restart at any time, enter `rs`
backend_1 | [nodemon] watching: *.*
backend_1 | [nodemon] starting `node index.js`
backend_1 | module.js:471
backend_1 | throw err;
backend_1 | ^
backend_1 |
backend_1 | Error: Cannot find module 'dotenv'
backend_1 | at Function.Module._resolveFilename (module.js:469:15)
backend_1 | at Function.Module._load (module.js:417:25)
backend_1 | at Module.require (module.js:497:17)
backend_1 | at require (internal/module.js:20:19)
backend_1 | at Object.<anonymous> (/usr/src/app/index.js:1:63)
backend_1 | at Module._compile (module.js:570:32)
backend_1 | at Object.Module._extensions..js (module.js:579:10)
backend_1 | at Module.load (module.js:487:32)
backend_1 | at tryModuleLoad (module.js:446:12)
backend_1 | at Function.Module._load (module.js:438:3)
backend_1 | [nodemon] app crashed - waiting for file changes before starting...
If I do ls -al
in the backend container, I get a full list of my backend app folder content, but it sounds like node_modules dependencies are not recognized.
If your
Dockerfile
andpackage.json
files are correct and still have the issue:1) Make sure you've rebuilt your container images.
2) Try
before starting the containers again with
docker-compose up
.This removes all volumes.
I also faced the same issue today when I run
docker-compose up
.The issue resolved by running
docker-compose up --build
instead ofdocker-compose up
.You need to install the dependencies in the container, which is missing from your Dockerfile.
The common way is to create a Dockerfile that is already aware of your application, and make it copy your
package.json
file and perform annpm install
.This allows your container to find all your code dependencies when you later run your application.
See and example here: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/
The sample
Dockerfile
:You may need to adapt paths for the
COPY
command, of course.