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
相关产品推荐
相关产品推荐

