Cannot find module for a node js app running in a docker compose environment

node.jsDockerNpmDocker Compose

node.js Problem Overview


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.

node.js Solutions


Solution 1 - node.js

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 an npm 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:

FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

You may need to adapt paths for the COPY command, of course.

Solution 2 - node.js

If your Dockerfile and package.json files are correct and still have the issue:

  1. Make sure you've rebuilt your container images.

  2. Try > docker-compose down -v

before starting the containers again with docker-compose up.

This removes all volumes.

Solution 3 - node.js

I also had the same issue when I run docker-compose up.

Issue resolved by running docker-compose up --build instead of docker-compose up.

Solution 4 - node.js

After adding npm install to the Dockerfile, add node_modules to volumes

volumes:
      - ./backend/:/usr/src/app
      - /usr/src/app/node_modules

Solution 5 - node.js

It happened to me because I had the file names in upper case.

what is recommended is rename files to lowercase

delete the dist folder

run again

npm run start:dev

to generate a new dist folder.

again run the

docker build -t <name> .

Solution 6 - node.js

I had the same issue, what you need to do is simply run npm i to install all the dependencies and after that rebuild, issue resolved

Solution 7 - node.js

Make sure that in package.json in the scripts object the npm start has the nodemon command to run your application

Example: if your application is served by the server.js file

"scripts": {
    "start": "nodemon server.js",
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjemlifathiView Question on Stackoverflow
Solution 1 - node.jsCharlieBrownView Answer on Stackoverflow
Solution 2 - node.jsM3RSView Answer on Stackoverflow
Solution 3 - node.jsNishanth DuvvaView Answer on Stackoverflow
Solution 4 - node.jsAditya MhamunkarView Answer on Stackoverflow
Solution 5 - node.jsFerney Cordoba CanchalaView Answer on Stackoverflow
Solution 6 - node.jsDanielView Answer on Stackoverflow
Solution 7 - node.jsLastM4NView Answer on Stackoverflow