运行dockerized node app

时间:2016-08-22 09:27:44

标签: node.js linux mongodb docker

我正在对我们的一个节点应用程序进行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'时,应用程序启动并正常工作。

但是,当我将此节点应用程序停靠,并尝试运行时,我得到“错误:生成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'命令
  3. 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
    

1 个答案:

答案 0 :(得分: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']);