2016-08-22 44 views
3

我正在dockerizing我们的一个节点应用程序。此应用程序的一个特点是,应用程序一开始就使用mongoexport下载mongodb数据并写入文件。运行dockerized节点应用程序时出现“错误:spawn mongoexport ENOENT”

我做这个使用child_process产卵

var spawn = require('child_process').spawn; 
var mongoExport = spawn('mongoexport', [ 
       '--db', 'dbname', '--collection', 'collection1', 
       '--fields', 
       'name,address,city,country,pincode', 
       '--type', 'csv' 
      ]); 

应用程序启动时,当我从运行命令提示符“节点app.js”工作正常。

但是,当我dockerized这个节点的应用程序,并尝试运行我得到“错误:产卵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

我曾尝试连接以下调试这个问题,

  1. 我检查注释掉mongoexport功能,一切正常工作正常。
  2. 我想,这可能是docker容器内的child_process问题。所以,我用一个简单的 'ls' 的命令
const ls = spawn('ls', ['-lh', '/usr']); 
ls.stdout.on('data', function(data){ 
    console.log("stdout:" + data); 
}); 

没有问题试过了,它工作得很好。

所以,我的结论是命令'mongoexport'不能在nodejs 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 
+0

难道'--type'是多余的,'--csv'就够了?见[mongoexport中带参数+ node.js +子进程](http://stackoverflow.com/a/20176549/1983854)。尽管mongoexport 3.0.0'--type = csv'中的[我看到](https://docs.mongodb.com/manual/reference/program/mongoexport/)是正确的方法。 – fedorqui

+0

是的。你是对的。 --type在最新的mongo中不被识别(我正在使用3.2.7进行测试)。它足以指定为--csv – Chandru

回答

3

我的搬运工文件正如我猜对了,问题是,“MongoDB的”未安装在nodeapp容器。

我所要做的就是添加以下线路中的Dockerfile在nodeapp容器

RUN apt-get update 
RUN apt-get install -y mongodb 

安装的MongoDB从代码中,我曾在mongoexport调用指定--host--port

var mongoExport = spawn('mongoexport', [ 
       '--db', 'dbname', '--host', 'mongo-rnd', '--port', 27017, '--collection', 'collection1','--fields', 'name,address,city,country,pincode', 
       '--csv']); 
相关问题