Docker挂载volume后启动容器提示Module Not Found错误如何解决
问题根因
你在docker run命令中使用-v ${pwd}:/app参数将本地工作目录挂载到了容器的/app目录,该操作会直接覆盖容器内/app路径下的所有内容:
- 镜像构建阶段通过
RUN npm install安装在容器/app/node_modules中的依赖包,会被本地目录下的内容完全替换 - 你的本地工作目录没有提前执行
npm install安装express等依赖,导致容器启动时找不到对应包 - 无volume参数时直接使用镜像内已经装好的依赖,因此运行正常
可行解决方案
- 方案1(推荐,适合开发热更新场景):新增匿名volume单独保留容器内的node_modules目录,避免被宿主机目录覆盖,修改后的启动命令如下:
# PowerShell 环境 docker run -v ${pwd}:/app -v /app/node_modules -p 3000:3000 -d --name node-app node-app-image
# CMD 命令提示符环境 docker run -v %cd%:/app -v /app/node_modules -p 3000:3000 -d --name node-app node-app-image
新增的-v /app/node_modules参数会告诉Docker不要将该路径映射到宿主机,保留容器内构建阶段生成的依赖文件。
方案2:提前在本地工作目录执行
npm install安装所有依赖,再启动挂载了volume的容器,需要保证本地Node版本和镜像内的Node 15版本兼容,避免出现依赖兼容性问题。方案3:如果不需要实时同步本地代码修改到容器内,直接移除启动命令中的
-v挂载参数即可,和你之前正常运行的场景一致。
内容的提问来源于stack exchange,提问作者S. Karki
相关产品推荐
相关产品推荐

