2016-07-18 73 views
0

我有以下情况:我有一个使用MongoDB的Node.js应用程序,因此使用Docker Compose,我可以有两个容器:一个用于Node应用程序,另一个用于MongoDB。如何使用Docker Compose在容器中运行命令?

现在,该应用程序必须支持以下功能:可以上传csv文件,该文件将使用mongoimport导入到Mongo中。

使用Node,运行mongoimport很容易,因为我们有exec函数。也就是说,它会做这样的事情的问题:

const exec = require('child_process').exec; 

exec('mongoimport -d database -c collection --type csv file.csv', function (error, stdout, stderr) { 
    // Other stuff here... 
}); 

唯一的问题是:mongoimport将不可用,因为MongoDB是比节点应用的另一个容器内!

现在该如何解决?我想通过exec使用ssh在Mongo容器上运行它,但我不确定它。

如何从节点应用程序将mongoimport运行到Mongo容器中?

+0

您可以在Node.js容器中安装mongo工具/客户端以使用mongoimport并指定MongoDB主机。但似乎没有exec的基于Node的解决方案可能会更清洁。部分取决于您对csv数据和这些文件的性质(大小,复杂程度等)所做的工作。 – ldg

+0

由于效率的原因,我避免了基于节点的解决方案。我正在导入一个类似250千行或更多行的文件。使用mongoimport,数据几乎是瞬间导入的,而使用Node.js则需要一些时间。现在,要安装这些mongo工具,我需要向dockerfile添加一些'apt-get'语句? – user1620696

+0

是的 - 如果工作很繁重,另一种方法是为它创建一个服务,也就是与Node应用共享一个卷的容器(因此它可以获取文件)和构建规范(Dockerfile),其中包括mongoimport和一个小应用程序,它允许您与Node应用程序(http或pub/sub等)进行通信。这个模型很好,你可以从你的主应用程序和数据库中抽象出实际的功能(mongoimport,无论)。 – ldg

回答

1

我会将所需的工具安装到我的Node.JS容器中。如果你不希望创建自己的图像,你可以用这一个:

https://hub.docker.com/r/bitliner/nodejs-bower-grunt-mongodbclients/

包括:

  • Mongoclient工具
  • 的Node.js /鲍尔和步兵

如果你想建立自己的形象,包括:

FROM image:latest 

RUN apt-get install -y mongodb-clients 

,并建立它:

docker build -t node-mongoclient . 

,并在你的搬运工,compose.yml文件替换的形象创造一个自我。

1

如果工作很繁重,另一种方法是为它创建一个单独的服务,即与Node应用程序共享一个卷(以便它可以获取文件)的另一个容器以及构建规范(Dockerfile)其中包括mongoimport和一个小应用程序,可让您与Node应用程序(http或pub/sub等)进行通信。这个模型很好,你可以从你的主应用程序和数据库中抽象出实际的功能(mongoimport,无论)。

对于http服务,您可以使用Node或其他任何东西,并且是的,某种API会很好。对于pub/sub,您可以使用Redis和Node作为一个非常轻量级的示例。它将允许您有权访问Redis客户端的任何服务参与。当然,如果你更熟悉Mongo,也可以使用Mongo,但Redis pub/sub非常简单。在你的情况下,你需要确保文件已经完全上传,然后通知你的服务才能正常工作。

相关问题