我很抱歉我的非常新手的问题,但我有一个可怕的一天弄清楚这个错误,我有一个Express应用程序,我试图在docker compose中运行它。我使用了这个Dockerfile:
FROM mhart/alpine-node
RUN mkdir -p /usr/src/app
RUN chmod -R 777 /usr/src/app
WORKDIR /usr/src/app
RUN npm install node-gyp -g
RUN npm install nodemon -g
ENV NODE_ENV development
EXPOSE 3000
我的docker-compose文件的这一部分:
backend:
mem_limit: 100m
build:
context: .
dockerfile: dockerfiles/node/Dockerfile
command: npm start
depends_on:
- mongo
- elasticsearch
volumes:
- ./backend/:/usr/src/app
ports:
- 3000:3000
links:
- "mongo:mongo"
- "elasticsearch:elasticsearch"
当我使用docker-compose时,我得到了这个错误:
backend_1 | npm info it worked if it ends with ok
backend_1 | npm info using npm@3.10.10
backend_1 | npm info using node@v6.9.5
backend_1 | npm info lifecycle service-designer@1.0.0~prestart: service-designer@1.0.0
backend_1 | npm info lifecycle service-designer@1.0.0~start: service-designer@1.0.0
backend_1 |
backend_1 | > service-designer@1.0.0 start /usr/src/app
backend_1 | > nodemon index.js
backend_1 |
backend_1 | [nodemon] 1.11.0
backend_1 | [nodemon] to restart at any time, enter `rs`
backend_1 | [nodemon] watching: *.*
backend_1 | [nodemon] starting `node index.js`
backend_1 | module.js:471
backend_1 | throw err;
backend_1 | ^
backend_1 |
backend_1 | Error: Cannot find module 'dotenv'
backend_1 | at Function.Module._resolveFilename (module.js:469:15)
backend_1 | at Function.Module._load (module.js:417:25)
backend_1 | at Module.require (module.js:497:17)
backend_1 | at require (internal/module.js:20:19)
backend_1 | at Object.<anonymous> (/usr/src/app/index.js:1:63)
backend_1 | at Module._compile (module.js:570:32)
backend_1 | at Object.Module._extensions..js (module.js:579:10)
backend_1 | at Module.load (module.js:487:32)
backend_1 | at tryModuleLoad (module.js:446:12)
backend_1 | at Function.Module._load (module.js:438:3)
backend_1 | [nodemon] app crashed - waiting for file changes before starting...
如果我在***backend***容器中执行ls -al
,我会得到一个完整的后端应用文件夹内容列表,但听起来node_modules依赖项无法识别。
9条答案
按热度按时间mznpcxlj1#
一些额外的东西我发现有帮助。列出Docker镜像中安装的node包。在我的示例中,它们安装在
/src
目录中。列出Docker镜像中包含已安装节点包的目录的内容。当然,应该有一个node_modules目录。
如果使用
docker run
命令从镜像部署容器,我错误地使用了--volume
选项,并将本地Docker主机上的文件挂载到容器中的/src目录。src目录是包含节点包的目录。这导致Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'dotenv' imported from /src/app.js
为我返回。我只需要包含文件名,这样我就不会挂载整个/src目录。
imzjd6km2#
如果您的
Dockerfile
和package.json
文件是正确的,但仍然存在以下问题:1.确保您已经重建了容器映像。
1.试试看
docker-compose down -v
然后再用
docker-compose up
启动容器。删除所有卷。
6ioyuze23#
您需要在容器中安装依赖项,这在Dockerfile中是缺失的。
常见的方法是创建一个已经知道你的应用程序的Dockerfile,并让它复制你的
package.json
文件并执行npm install
。这允许您的容器在以后运行应用程序时查找所有代码依赖项。
请参见此处的示例:https://nodejs.org/en/docs/guides/nodejs-docker-webapp/
样本
Dockerfile
:当然,您可能需要为
COPY
命令调整路径。fsi0uk1n4#
我在运行
docker-compose up
时也遇到了同样的问题。通过运行
docker-compose up --build
而不是docker-compose up
解决了问题。2q5ifsrm5#
将
npm install
添加到Dockerfile后,将node_modules添加到卷tjjdgumg6#
它发生在我身上,因为我有大写的文件名。
建议将文件重命名为小写
删除dist文件夹
再跑
生成一个新的dist文件夹。
再次运行
ee7vknir7#
如果你的Dockerfiles和compose文件是正确的,那么你应该这样做
docker-compose build --no-cache
然后你可以再次做docker-compose up
。这为我解决了这个问题。vcudknz38#
确保在
package.json
的scripts
对象中,npm start
具有nodemon命令来运行应用程序示例:如果应用程序由
server.js
文件提供服务pkln4tw69#
我有同样的问题,你需要做的是简单地运行
npm i
安装所有的依赖项,并在重建后,问题解决