You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:30:55