2016-08-22 45 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']); 
相關問題