Windows使用Docker Desktop运行Node.js Docker镜像报express模块缺失错误
问题原因
错误MODULE_NOT_FOUND: Cannot find module 'express'是由于你的Node.js项目依赖包未安装导致:官方node基础镜像仅提供Node.js运行时和npm工具,不会自动安装你项目package.json中声明的第三方依赖(比如express),你直接执行npm start自然找不到对应的依赖包。
解决方案
方案一:单次运行临时安装依赖
你可以在启动命令里先执行npm install安装依赖,再执行启动命令,修改后的命令如下:
docker run -p 8080:3000 -v C:/tmp/ExpressSite:/var/www -w "/var/www" node sh -c "npm install && npm start"
注意:Windows环境下如果用PowerShell运行上述命令报错,可以把
sh -c换成cmd /c,或者直接拆分两步执行:
- 先装依赖:
docker run -v C:/tmp/ExpressSite:/var/www -w "/var/www" node npm install- 再启动服务:
docker run -p 8080:3000 -v C:/tmp/ExpressSite:/var/www -w "/var/www" node npm start
方案二:编写Dockerfile构建自定义镜像(更规范,适合学习Docker的场景)
你可以在ExpressSite目录下新建名为Dockerfile的文件,内容如下:
# 基于官方node镜像 FROM node:16 # 设置工作目录 WORKDIR /var/www # 拷贝package.json文件提前装依赖(利用Docker缓存提升构建速度) COPY package*.json ./ RUN npm install # 拷贝所有项目代码 COPY . . # 暴露3000端口 EXPOSE 3000 # 启动命令 CMD ["npm", "start"]
然后在ExpressSite目录下执行构建命令:
docker build -t my-express-app .
构建完成后运行容器即可:
docker run -p 8080:3000 my-express-app
如果需要本地修改代码实时生效,还是可以挂载本地目录覆盖容器内的代码:
docker run -p 8080:3000 -v C:/tmp/ExpressSite:/var/www my-express-app
额外注意事项
- 每次修改
package.json新增依赖后,都需要重新执行npm install或者重新构建Docker镜像 - Windows挂载目录时要确保Docker Desktop已经开放了C盘的挂载权限,在Docker Desktop设置->Resources->File Sharing里勾选C盘即可
内容的提问来源于stack exchange,提问作者Naresh Chaurasia
相关产品推荐
相关产品推荐

