Docker容器内Nodemon失效及package.json找不到问题求助
Docker容器中Nodemon文件变更检测失效及package.json找不到问题解决
问题现象
- 使用匿名卷或绑定挂载时,容器内的Nodemon无法正确检测本地文件变更
- 容器启动日志出现以下错误:
npm 错误代码 ENOENT
npm 错误系统调用 open
npm 错误路径 /app/package.json
npm 错误错误码 -2
npm 错误 enoent 无法读取package.json:错误:ENOENT:没有该文件或目录,打开 '/app/package.json'
npm 错误 enoent 这与npm无法找到文件有关。
npm 错误 enoent
相关配置文件
server.ts
app.get('/', (req, res) => { console.log('Testing this GET API..'); res.status(201).send('Hello from Docker and Kubernetes'); });
package.json
{ "name": "rest-api-endpoints-for-todo-project", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "nodemon src/server.ts" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "body-parser": "^1.19.0", "cors": "^2.8.5", "express": "^4.17.1", "jsonwebtoken": "^9.0.2", "lodash": "^4.17.21", "md5": "^2.3.0", "mssql": "^6.2.1", "node": "^22.2.0", "typescript": "^5.3.3" }, "devDependencies": { "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/jsonwebtoken": "^9.0.2", "@types/mssql": "^9.1.4", "@types/node": "^20.14.2", "concurrently": "^8.2.2", "nodemon": "^3.1.2", "ts-node": "^10.9.2" } }
Dockerfile
FROM node:22 WORKDIR /app/ COPY ./package.json . RUN npm install COPY . . EXPOSE 4000 CMD ["npm","start"]
解决方案
1. 解决package.json找不到的问题
问题根源是绑定挂载/匿名卷覆盖了容器内的/app目录:
- 绑定挂载时,本地目录会完全覆盖容器内的/app路径,如果本地目录没有package.json,容器内就会丢失该文件
- 匿名卷挂载到/app时,会用空目录覆盖容器内已通过
COPY命令复制的内容,导致package.json被隐藏
解决方法:
- 绑定挂载时,确保本地项目根目录存在
package.json,且挂载命令指向项目根目录 - 不要将匿名卷直接挂载到/app目录,可针对特定子目录(如
/app/src)使用匿名卷
2. 解决Nodemon无法检测文件变更的问题
Nodemon默认依赖文件系统的inotify事件,但Docker绑定挂载在Windows、macOS等非Linux主机上不会传递该事件,导致变更无法被感知。
解决方法:
方法一:启用Nodemon轮询模式
修改package.json的启动脚本,添加-L参数启用轮询扫描:
"scripts": { "start": "nodemon -L src/server.ts" }
-L参数让Nodemon通过定期扫描文件系统检测变更,兼容性更强,适配Docker挂载场景。
方法二:单独保留容器内的node_modules
绑定挂载时,用匿名卷单独保留容器内的node_modules,避免本地空目录覆盖依赖:
docker run -v $(pwd):/app -v /app/node_modules your-image-name
第一个挂载映射本地项目目录到/app,第二个匿名卷保留容器内已安装的依赖。
方法三:配置Nodemon监听规则
创建nodemon.json文件,明确设置监听路径和文件类型:
{ "watch": ["src/**/*.ts"], "ext": "ts", "exec": "ts-node src/server.ts" }
内容的提问来源于stack exchange,提问作者Kushal Nanavati
相关产品推荐
相关产品推荐

