I run "docker compose up", and this is the error message:
recipeapp-server-1 | Error: Cannot find module 'express'
recipeapp-server-1 | Require stack:
recipeapp-server-1 | - /usr/src/app/index.js
recipeapp-server-1 | at Module._resolveFilename (node:internal/modules/cjs/loader:1142:15)
recipeapp-server-1 | at Module._load (node:internal/modules/cjs/loader:983:27)
recipeapp-server-1 | at Module.require (node:internal/modules/cjs/loader:1230:19)
recipeapp-server-1 | at require (node:internal/modules/helpers:179:18)
recipeapp-server-1 | at Object.<anonymous> (/usr/src/app/index.js:1:17)
recipeapp-server-1 | at Module._compile (node:internal/modules/cjs/loader:1368:14)
recipeapp-server-1 | at Module._extensions..js (node:internal/modules/cjs/loader:1426:10)
recipeapp-server-1 | at Module.load (node:internal/modules/cjs/loader:1205:32)
recipeapp-server-1 | at Module._load (node:internal/modules/cjs/loader:1021:12)
recipeapp-server-1 | at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:142:12) {
recipeapp-server-1 | code: 'MODULE_NOT_FOUND',
recipeapp-server-1 | requireStack: [ '/usr/src/app/index.js' ]
recipeapp-server-1 | }
Dockerfile:
FROM node
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
RUN num install express
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
With and without "RUN npm install express" give the same result.
docker-compose.yml:
version: '3.9'
services:
server:
volumes:
- /usr/src/app/node_modules
build: .
ports:
- '3001:3000'
db:
image: 'postgres'
ports:
- '4444:5432'
environment:
POSTGRES_USER: 'postgres'
POSTGRES_PASSWORD: 'root'
With and without volumes give the same result.
package.json:
{
"name": "recipeapp",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.18.3",
"pg": "^8.11.3"
}
}
What I have tried:
- I have tried to add/remove "RUN npm install express" in Dockerfile and add/remove volume in docker-compose.yml.
- I have removed package-lock.json according to https://stackoverflow.com/a/75195936/14432555.
- I have add "node_process: container_name: container_node restart: unless-stopped" under server and changed "- /usr/src/app/node_modules" to "- ./node_process:/var/node_process - /var/node_process/node_modules" according to https://www.reddit.com/r/docker/comments/muqfds/comment/h8xvfng/?utm_source=share&utm_medium=web2x&context=3.
- I have changed "WORKDIR /usr/src/app" to "WORKDIR /usr/app" and "COPY . ." to "COPY ./src ." in Dockerfile, and changed volumes to "volumes: - ./src:/usr/app/" in docker-compose.yml according to https://forums.docker.com/t/dockerized-node-js-app-error-cannot-find-module/74280/2
The result of trying:
- Nothing works.
- Still doesn't work.
- I get the new error: "validating C:\Path\RecipeApp\docker-compose.yml: services.server Additional property node_process is not allowed"
- Still doesn't work.
What am I expecting: Work properly without any error.
node_modulesdirectory in a Docker anonymous volume, so it will ignore changes to thepackage.jsonfile and additional manualRUN npm install ...commands. Deleting it is right, especially if it's the only volume mount.COPY . .beforenpm install. You'll be overwritingnode_moduleswith whatever you have in your local directory when runningdocker compose build, which is who knows what. Don't forget to rebuild the image.COPY . .beforenpm installand rebuilding the image. It works now, thanks a lot, but I don't know which step solves the problem.