Docker绑定挂载报错无法加载端口,找不到express模块求助
Docker Bind Mount启动容器报错:Cannot find module express
问题场景
在Windows系统上跟随MacOS环境的Docker教程实操,使用named volume创建容器时一切正常,但使用bind mount启动容器后端口无法访问,查看docker logs显示错误:Cannot find module express
相关信息
Dockerfile
FROM node:14 WORKDIR /app COPY package.json /app RUN npm install COPY . /app EXPOSE 80 CMD ["node", "server.js"]
项目路径
E:\downloads\Compressed\data-volumes-01-starting-setup
启动命令
- Named Volume启动命令:
PS E:\downloads\Compressed\data-volumes-01-starting-setup> docker run -d -p 3000:80 --name feedback-container -v feedback-volume:/app/feedback feedback-node
- Bind Mount启动命令:
PS E:\downloads\Compressed\data-volumes-01-starting-setup> docker run -d -p 3000:80 --name feedback-container -v feedback:/app/feedback -v E:\downloads\Compressed\data-volumes-01-starting-setup:/app feedback-node
环境信息
工具:VS Code;镜像名:feedback-node;容器名:feedback-container;卷名:feedback-volume
原因分析
使用bind mount将本地项目目录挂载到容器的/app目录时,本地目录中没有node_modules文件夹(镜像构建时npm install生成的node_modules在容器镜像内部,而本地项目通常不会把node_modules提交到版本库,或通过.gitignore忽略了该目录),挂载后本地目录覆盖了容器内/app下的所有内容,包括镜像中已安装的node_modules,导致Node.js找不到express模块。
解决方案
方法1:挂载匿名卷保留容器内的node_modules
在启动命令中添加一个指向/app/node_modules的匿名卷,Docker会优先使用容器镜像内的node_modules,不会被本地挂载覆盖:
PS E:\downloads\Compressed\data-volumes-01-starting-setup> docker run -d -p 3000:80 --name feedback-container -v feedback:/app/feedback -v E:\downloads\Compressed\data-volumes-01-starting-setup:/app -v /app/node_modules feedback-node
方法2:本地安装依赖(不推荐,可能存在跨平台问题)
在本地项目目录执行npm install,将依赖包下载到本地的node_modules目录,这样挂载后容器就能读取到本地的依赖:
PS E:\downloads\Compressed\data-volumes-01-starting-setup> npm install
之后再执行原来的bind mount启动命令即可。
内容的提问来源于stack exchange,提问作者Vidyasagar Ramachandran
相关产品推荐
相关产品推荐

