Cannot find module for a node js app running in a docker compose environment
node.jsDockerNpmDocker Composenode.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:
-
Make sure you've rebuilt your container images.
-
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",
}