Docker容器环境下Nodemon实时更新失效问题求助
嘿,我来帮你搞定这个Nodemon在Docker里不生效的问题!你遇到的情况其实挺常见的,核心原因是容器内的Nodemon要么没拿到宿主机的文件变更,要么没法检测到这些变更,咱们一步步来修正:
1. 先把Dockerfile的路径错误改掉
你的Dockerfile里有个明显的路径问题:COPY package.json /. 这行把package.json复制到了容器的根目录/,但你设置的工作目录是/app,npm install自然没法正确找到依赖配置。另外复制代码的路径也可以优化下,建议改成这样:
FROM node:alpine WORKDIR /app # 把package.json复制到当前工作目录(/app) COPY package.json ./ RUN npm install # 复制项目所有文件到容器工作目录(记得加.dockerignore避免冗余文件) COPY . . CMD ["npm", "run", "dev"]
顺便建议你在项目根目录加个.dockerignore文件,内容如下,防止本地的node_modules等文件被复制到容器里引发冲突:
node_modules .dockerignore Dockerfile docker-compose.yml
2. 修正docker-compose的卷挂载路径
你当前的卷挂载配置是"./app:/usr/src/app/app",但容器里的工作目录是/app,这就导致宿主机的文件同步到了容器的/usr/src/app/app,而Nodemon监听的是/app目录下的代码,自然看不到变化!
把docker-compose.yml里app服务的volumes改成下面这样,让宿主机的项目根目录直接挂载到容器的工作目录/app:
services: app: container_name: NodeJs build: . volumes: - ./:/app # 关键:本地根目录和容器工作目录同步 ports: - 3000:3000 # ... 其他服务配置不变
3. 给Nodemon加上强制监听参数
Docker容器的文件系统通常不支持宿主机的文件变更通知机制,Nodemon默认的监听方式可能检测不到变化。你需要在package.json的dev脚本里加上-L(也就是--legacy-watch的简写),强制Nodemon用轮询的方式监听文件:
{ "scripts": { // ... 其他脚本不变 "dev": "nodemon -L index.js" } }
最后验证效果
把这些修改都完成后,先停止之前的容器,然后重新运行npm run docker。现在修改本地的代码,比如改index.js里的响应内容,应该能看到容器控制台输出Nodemon重启的日志,刷新localhost:3000也能看到更新后的内容啦!
内容的提问来源于stack exchange,提问作者Asia Piazza

