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

Docker环境下Nodemon无法重启NodeJS Express(TypeScript)服务

TypeScript Express容器化后Nodemon无法自动重启的问题排查

我正尝试将基于TypeScript的NodeJS Express服务容器化,但Nodemon无法在文件变更时自动重启服务。已经在StackOverflow上查找过相关问题,但都没解决,怀疑是配置出了问题。我的环境是Windows x64系统搭配WSL2的Docker Desktop。

现有配置文件

package.json

{
    "name": "backend",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "build": "tsc -p .",
        "dev:ts": "tsc -w",
        "dev:js": "nodemon --legacy-watch --watch ./src --watch ./app/src dist/index.js",
        "dev": "concurrently npm:dev:*",
        "start": "node dist/index.js"
    },
    "keywords": [],
    "author": "alessandrofoglia07",
    "license": "MIT",
    "dependencies": {
        "bcrypt": "^5.1.0",
        "cheerio": "^1.0.0-rc.12",
        "cors": "^2.8.5",
        "curse-filter": "^3.1.0",
        "dotenv": "^16.3.1",
        "express": "^4.18.2",
        "jsonwebtoken": "^9.0.1",
        "mongoose": "^7.4.1",
        "multer": "^1.4.5-lts.1",
        "node-cron": "^3.0.2",
        "nodemailer": "^6.9.4",
        "uuid": "^9.0.0",
        "zod": "^3.21.4"
    },
    "devDependencies": {
        "@types/bcrypt": "^5.0.0",
        "@types/cors": "^2.8.13",
        "@types/express": "^4.17.17",
        "@types/jsonwebtoken": "^9.0.2",
        "@types/leo-profanity": "^1.5.0",
        "@types/multer": "^1.4.7",
        "@types/node-cron": "^3.0.8",
        "@types/nodemailer": "^6.4.9",
        "@types/uuid": "^9.0.2",
        "@typescript-eslint/eslint-plugin": "^6.2.0",
        "@typescript-eslint/parser": "^6.2.0",
        "concurrently": "^8.2.0",
        "eslint": "^8.45.0",
        "nodemon": "^3.0.1",
        "typescript": "^5.1.6"
    },
    "type": "module"
}

tsconfig.json

{
    "compilerOptions": {
        "target": "es2016",
        "module": "ESNext",
        "rootDir": "./src",
        "moduleResolution": "NodeNext",
        "outDir": "./dist",
        "esModuleInterop": true,
        "forceConsistentCasingInFileNames": true,
        "strict": true,
        "noImplicitAny": true,
        "noUncheckedIndexedAccess": true,
        "skipLibCheck": true
    }
}

Dockerfile.dev

FROM node:18
WORKDIR /app
COPY package*.json .
RUN npm install
COPY . .
ENV PORT 5000
ENV NODE_ENV development
EXPOSE $PORT
CMD ["npm", "run", "dev"]

docker-compose.yml

version: '3'
services:
    frontend:
        container_name: luxedge-frontend
        tty: true
        stdin_open: true
        env_file:
            - ./frontend/.env
    backend:
        container_name: luxedge-backend
        tty: true
        stdin_open: true
        env_file:
            - ./backend/.env
        ports:
            - '5000:5000'

docker-compose-dev.yml

version: '3'
services:
    frontend:
        build:
            context: ./frontend
            dockerfile: Dockerfile.dev
        ports:
            - '3000:3000'
        volumes:
            - ./frontend/src:/app/src:ro
            - ./frontend/public:/app/public:ro
            - ./frontend/index.html:/app/index.html:ro
    backend:
        restart: always
        build:
            context: ./backend
            dockerfile: Dockerfile.dev
        volumes:
            - ./backend/src:/app/src:ro
            - ./backend/public:/app/public:ro
            - /app/node_modules
        environment:
            - NODE_ENV=development
            - CHOKIDAR_USEPOLLING=true

启动命令

docker-compose -f docker-compose.yml -f docker-compose-dev.yml up -d

修复方案

1. 修正Nodemon监听目标

当前dev:js命令错误监听了src目录,Nodemon应监听编译后的dist目录——tsc -w已负责监听src变化并编译,Nodemon只需在dist文件更新时重启服务。修改package.json的scripts:

"dev:js": "nodemon --legacy-watch --watch ./dist dist/index.js",

2. 增强WSL2文件监听能力

WSL2与Windows文件系统交互存在通知延迟,需给Nodemon添加轮询参数确保捕获变化:

"dev:js": "nodemon --legacy-watch --watch ./dist --poll 1000 dist/index.js",

3. 适配ES模块配置

由于package.json设置了"type": "module",添加nodemon.json配置文件到项目根目录:

{
  "exec": "node --experimental-specifier-resolution=node dist/index.js",
  "watch": ["./dist"],
  "legacyWatch": true,
  "poll": 1000
}

随后简化package.json中的命令:

"dev:js": "nodemon",

4. 完善Docker挂载配置

当前挂载仅同步src,需确保配置文件修改能同步到容器。在docker-compose-dev.yml的backend volumes中添加:

- ./backend/tsconfig.json:/app/tsconfig.json:ro
- ./backend/package.json:/app/package.json:ro

5. 验证容器内流程

进入容器确认编译与监听是否正常:

docker exec -it luxedge-backend bash
# 修改宿主机src文件后,检查容器内dist是否更新
ls dist
# 查看服务日志
npm run dev

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:08:12