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

Docker中Nodemon无法检测Express+TypeScript代码变更求助

Express + TypeScript Docker 热重载问题排查与解决

问题场景

本地通过nodemon src/index.ts启动应用时热重载正常,但Docker容器内已通过卷同步代码、文件确已更新的情况下,Nodemon无法识别代码变更触发重载。

已安装依赖

"dependencies": {
    "cors": "^2.8.5",
    "express": "^4.18.2"
},
"devDependencies": {
    "@types/cors": "^2.8.13",
    "@types/express": "^4.17.17",
    "dotenv": "^16.0.3",
    "nodemon": "^2.0.20",
    "ts-node": "^10.9.1",
    "typescript": "^4.9.5"
}

现有配置

docker-compose.yml

api:
    build:
        context: ./api
        dockerfile: Dockerfile
        target: base
    volumes:
        - ./api:/app
        - /app/node_modules
    container_name: api
    ports:
        - 5000:5000
    command: npm run dev

tsconfig.json

"compilerOptions": {
        "target": "es2016",
        "module": "commonjs",
        "moduleResolution": "node",
        "baseUrl": "./src",
        "outDir": "./dist",
        "esModuleInterop": true,
        "strict": true
    }

解决方法

1. 强制Nodemon使用轮询模式监听文件变化

Docker卷在Windows/macOS环境下,文件系统的inotify事件无法直接传递到容器内,导致Nodemon无法感知文件变更。需要在启动命令中添加--legacy-watch(或简写-L)参数强制轮询:

修改package.json中的dev脚本:

"scripts": {
    "dev": "nodemon -L src/index.ts"
}

2. 添加Nodemon配置文件明确监听规则

创建nodemon.json文件,指定监听目录、文件扩展名,确保只关注TypeScript文件变更:

{
  "watch": ["src"],
  "ext": "ts",
  "exec": "ts-node src/index.ts"
}

之后修改dev脚本为:

"scripts": {
    "dev": "nodemon -L"
}

3. 确保Docker镜像构建时安装了开发依赖

检查你的Dockerfile(base阶段)是否安装了devDependencies,如果只安装生产依赖,容器内会缺少Nodemon等工具:

# base阶段示例
FROM node:18-alpine AS base
WORKDIR /app
COPY package*.json ./
RUN npm install # 不要用npm install --production,确保安装dev依赖
COPY . .

4. 验证卷挂载的路径一致性

确认本地./api目录和容器内/app目录的文件结构完全一致,避免因路径映射问题导致Nodemon监听的目录没有实际变更。

内容的提问来源于stack exchange,提问作者Fiisa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:06:39