求Windows WSL2环境下带热重载的NestJS 9 Docker化示例
WSL2下Docker化NestJS 9实现热重载的完整配置方案
核心问题原因
WSL2与Windows文件系统的文件变更通知机制不兼容,直接挂载Windows目录到容器时,容器内的nodemon无法捕获文件修改事件。解决核心是将代码放在WSL2内部的文件系统,而非Windows的/mnt/c等挂载目录,同时配置正确的Docker和NestJS热重载参数。
步骤1:在WSL2内初始化NestJS 9项目
# 进入WSL2的Ubuntu环境目录,比如~/projects mkdir nest-docker-hotreload && cd nest-docker-hotreload npm i -g @nestjs/cli@9 nest new . --skip-git
步骤2:创建Docker配置文件
Dockerfile.dev(开发环境专用)
FROM node:18-alpine WORKDIR /app # 先拷贝依赖文件,利用Docker缓存优化构建速度 COPY package*.json ./ RUN npm install # 拷贝项目源码 COPY . . # 暴露服务端口 EXPOSE 3000 # 启动带热重载的开发服务 CMD ["npm", "run", "start:dev"]
docker-compose.yml
version: '3.8' services: nest-api: build: context: . dockerfile: Dockerfile.dev ports: - "3000:3000" volumes: # 挂载WSL2内的源码目录到容器,覆盖/app下的文件(排除node_modules) - ./:/app - /app/node_modules environment: - NODE_ENV=development
步骤3:确认NestJS热重载配置
确保package.json中的start:dev命令参数正确:
{ "scripts": { "start:dev": "nest start --watch" } }
若遇到异常,可手动添加nodemon.json配置:
{ "watch": ["src"], "ext": "ts", "exec": "ts-node src/main.ts" }
步骤4:启动服务并验证热重载
在WSL2的项目目录下执行:
docker-compose up --build
修改WSL2内src目录下的文件(比如app.service.ts),容器会自动检测到变更并重启服务。
关键注意事项
- 必须在WSL2内部文件系统操作代码:不要将项目放在Windows的
C:\等目录再通过/mnt/c访问,WSL2对Windows文件系统的文件变更通知支持有限。 - volume挂载规则:
./:/app挂载WSL2源码到容器,/app/node_modules避免宿主目录覆盖容器内的依赖,防止权限或兼容性问题。 - Node版本匹配:Docker镜像的Node版本尽量与WSL2本地Node版本一致,减少依赖安装差异。
内容的提问来源于stack exchange,提问作者Raul Aquino
相关产品推荐
相关产品推荐

