问题描述
在使用Docker和Node.js时遇到了一个问题。当他使用sudo docker-compose up
命令启动一个包含Node.js的测试应用程序时,出现了以下错误:
Starting testapp_web_1 ... done
Attaching to testapp_web_1
web_1 | > testapp@0.0.1 start /usr/app
web_1 | > node index.js
web_1 | internal/modules/cjs/loader.js:613
web_1 | throw err;
web_1 | ^
web_1 | Error: Cannot find module 'mongodb'
他已经阅读了一些资料,包括一个相关的Stack Overflow主题,但是无论他尝试使用哪个模块(如mongodb、spdy等),都会出现这个错误。在本地不使用Docker时,测试应用程序是正常工作的。他希望能够找到在Docker中出现问题的原因并解决它。
解决方案
以下解决方案基于提供的问答数据和已知信息。
方案1:移除无用的卷挂载
在docker-compose.yml
文件中,你使用了一个卷挂载来映射/usr/app/node_modules
路径。然而,这可能会覆盖Dockerfile构建阶段中安装的node_modules
。在启动容器时,该挂载路径是空的,因此会出现找不到模块的错误。你可以尝试移除这个卷挂载,让node_modules
目录保持Dockerfile构建时的状态。
version: '3'
services:
web:
build: .
command: npm start
ports:
- 80:8080
方案2:重新构建镜像
如果你仍然遇到模块找不到的问题,可以尝试重新构建Docker镜像,确保在构建过程中正确安装了依赖。
Dockerfile
FROM node:12-alpine
WORKDIR /usr/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
docker-compose.yml
version: '3'
services:
web:
build: .
command: npm start
ports:
- 80:8080
构建镜像
在应用程序根目录下,打开终端并运行以下命令以构建镜像:
docker-compose build
启动容器
构建成功后,运行以下命令启动容器:
docker-compose up
这样,容器将在启动时正确安装所有依赖,包括mongodb
模块。
方案3:检查应用代码
如果以上方法仍然无法解决问题,你可能需要仔细检查应用程序代码,确保没有其他因素导致模块找不到的错误。可能的原因包括路径问题、文件名错误或其他代码问题。
总结
通过移除无用的卷挂载或重新构建镜像,你有机会解决这个问题。如果问题仍然存在,建议检查应用程序代码以查找其他潜在问题。希望这些解决方案能帮助你成功在Docker中运行Node.js应用程序。