Docker容器中Nodemon无法自动重载Express应用该如何解决?
问题修复方案
1. 调整Dockerfile配置
你当前的Dockerfile缺少项目依赖安装步骤,且构建阶段复制代码的逻辑不适用于开发热重载场景,修改如下:
FROM node:14-alpine WORKDIR /usr/app RUN npm install -g nodemon # 先复制package相关文件安装依赖,利用镜像缓存提升构建速度 COPY package*.json ./ RUN npm install EXPOSE 3000 CMD ["npm","start"]
2. 修改Nodemon启动参数适配容器环境
容器和宿主机的文件系统事件传递机制存在差异,默认的Nodemon监听规则无法感知宿主机的文件变更,需要开启legacy监听模式,修改package.json的start脚本:
"start": "nodemon --legacy-watch app.js"
3. 启动容器时添加本地目录挂载
你之前启动容器没有挂载本地代码目录,构建时复制到镜像里的代码是固定的,本地修改不会同步到容器内,启动容器时添加-v参数挂载目录:
docker run -v $(pwd):/usr/app -p 3000:3000 <你的镜像名称>
如果是Windows环境,把$(pwd)替换成本地项目的绝对路径即可。
可选:使用docker-compose简化启动配置
如果不想每次启动都输入长命令,可以在项目根目录新建docker-compose.yml:
version: '3' services: express-app: build: . ports: - "3000:3000" volumes: - ./:/usr/app # 排除node_modules目录,避免容器内安装的依赖被宿主机覆盖 - /usr/app/node_modules
之后直接执行docker-compose up即可启动服务,本地修改代码会自动同步到容器,Nodemon也会正常触发重载。
内容的提问来源于stack exchange,提问作者Willon Ferreira
相关产品推荐
相关产品推荐

