Docker里跑Node.js服务,改了代码为啥没生效?
我在本地用 Docker 启动了一个 Node.js 服务,挂载了代码目录,但改完 app.js 文件后容器里的服务没更新,还是旧逻辑。我明明用了卷挂载啊,难道还要手动重启容器?
我的启动命令是这样的:
docker run -d -p 3000:3000 -v $(pwd):/app --name my-node-app node:18-alpine sh -c "cd /app && npm install && npm start"
是不是因为 npm start 启动的是普通 node 进程,不监听文件变化?那在开发环境该怎么搞才不用每次 rebuild 镜像?
npm start跑的就是普通的 node 进程,它不会监听文件变化。容器启动时把代码跑起来了,之后你改代码,进程压根不知道。所以你得重启容器里的进程。有两种搞法:
方案一:重启容器(最省事)
改完代码后执行:
容器重启后会用新的代码启动服务。卷挂载本来就是实时生效的,你只是需要让进程重新加载代码。
方案二:用 nodemon 自动监听重启(推荐开发环境用)
先在容器里装 nodemon:
然后改启动命令,用 nodemon 代替 node:
或者进容器里手动重启进程:
说白了就是:卷挂载解决的是"代码同步"问题,不解决"进程Reload"问题。改完代码,要么重启容器,要么用 nodemon 之类工具自动触发重启。