当运行容器化的Node应用程序时出现"Error: spawn mongoexport ENOENT"错误

4
我正在将我们的一个Node应用程序进行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”时,应用程序启动并正常工作。

然而,当我将这个node应用程序docker化后尝试运行时,出现了“Error: spawn mongoexport ENOENT”的错误信息。

我在一个容器中运行mongodb,在另一个容器中运行与mongodb容器链接的node应用程序。

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

为了调试此问题,我尝试了以下操作:

  1. 我注释掉了mongoexport功能,一切都如预期般正常工作。
  2. 我认为可能是docker容器内部的child_process存在问题。因此,我尝试了一个简单的“ls”命令。
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', function(data){
  console.log("stdout:" + data);
});

没问题,它运行得很好。

所以,我的结论是在nodejs docker容器中命令'mongoexport'不可用。

有人有想法如何实现这一点吗?或者这不可能做到吗?

以下是我参考的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 中看到。虽然根据 mongoexport 3.0.0 的文档 I see --type=csv 是正确的方式。 - fedorqui
是的,你是正确的。--type在最新版本的Mongo中不被识别(我正在测试3.2.7)。只需指定为--csv即可。 - chank
1个回答

4

正如我所猜测的那样,问题在于 'mongodb' 没有安装在 nodeapp 容器中。

我只需要在 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']);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接