运行 dockerized 节点应用程序时出现“错误:spawn mongoexport ENOENT”
Posted
技术标签:
【中文标题】运行 dockerized 节点应用程序时出现“错误:spawn mongoexport ENOENT”【英文标题】:"Error: spawn mongoexport ENOENT" when running dockerized node app 【发布时间】:2016-12-28 18:53:58 【问题描述】:我正在对我们的一个节点应用程序进行 docker 化。此应用程序的功能之一是,在开始时,该应用程序使用 mongoexport 下载 mongodb 数据并写入文件。
我正在使用 child_process spawn 进行此操作
var spawn = require('child_process').spawn;
var mongoExport = spawn('mongoexport', [
'--db', 'dbname', '--collection', 'collection1',
'--fields',
'name,address,city,country,pincode',
'--type', 'csv'
]);
当我从命令提示符运行“node app.js”时,应用程序启动并正常工作。
但是,当我将此节点应用程序 docker 化并尝试运行时,我得到“错误:spawn mongoexport ENOENT”。
我在一个容器中运行 mongodb,并在另一个容器中运行节点应用程序与 mongodb 容器链接
docker run --restart=always --name mongo-rnd -v /opt/mongo_rnd:/data/db -d mongo:3.2.7
docker run -e "MONGO_HOST=mongo-rnd" -p 8081:8081 -d --name nodeapp --link mongo-rnd:mongo-rnd nodeappimageid
我已尝试以下方法来调试此问题,
-
我通过注释掉 mongoexport 功能进行了检查,一切正常。
我想,这可能是 docker 容器内的 child_process 问题。所以,我尝试了一个简单的“ls”命令
const ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', function(data) console.log("stdout:" + data); );
没问题,效果很好。
所以,我的结论是命令 'mongoexport' 在 nodejs docker 容器中不可用。
有人知道如何实现这一目标吗?还是不能这样做?
这是我的 docker 文件供参考
FROM node:wheezy
RUN mkdir -p /usr/src/temp
COPY . /usr/src/temp
WORKDIR /usr/src/temp
RUN npm install
ENV PORT=8081
ENV MONGO_HOST "localhost"
EXPOSE 8081
CMD node app.js
【问题讨论】:
难道--type
是多余的,而仅--csv
就足够了吗?见于mongoexport with parameters + node.js + child process。虽然 I see from mongoexport 3.0.0 --type=csv
是正确的方法。
是的。你是对的。 --type 在最新的 mongo 中无法识别(我正在使用 3.2.7 进行测试)。足以指定为 --csv
【参考方案1】:
我猜对了,问题是 nodeapp 容器中没有安装“mongodb”。
我所要做的就是在 Dockerfile 中添加以下行以在 nodeapp 容器中安装 mongodb
RUN apt-get update
RUN apt-get install -y mongodb
从我必须在 mongoexport 调用中指定 --host
和 --port
的代码:
var mongoExport = spawn('mongoexport', [
'--db', 'dbname', '--host', 'mongo-rnd', '--port', 27017, '--collection', 'collection1','--fields', 'name,address,city,country,pincode',
'--csv']);
【讨论】:
以上是关于运行 dockerized 节点应用程序时出现“错误:spawn mongoexport ENOENT”的主要内容,如果未能解决你的问题,请参考以下文章
在 Docker Toolbox 中运行 Java 应用程序时出现 SunCertPathBuilderException
Docker 容器在运行 php 应用程序时出现 503 错误
使用 rust 二进制文件运行 docker 映像时出现权限被拒绝错误