如何使用Docker Compose在容器中运行命令?

时间:2016-07-18 02:54:54

标签: node.js mongodb docker

我有以下情况:我有一个使用MongoDB的Node.js应用程序,因此使用Docker Compose我可以有两个容器:一个用于Node应用程序,另一个用于MongoDB。

现在,该应用必须支持以下功能:可以上传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位于另一个容器内,而不是Node应用程序!

现在怎么解决这个问题?我想通过exec使用ssh在Mongo容器上运行它,但我不确定它。

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

2 个答案:

答案 0 :(得分:1)

我会将所需的工具安装到我的Node.JS容器中。如果您不想创建自己的图像,可以使用以下图像:

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

,包括:

  • Mongoclient-工具
  • Node.JS / Bower和Grunt

如果您想构建自己的图片,请添加:

FROM image:latest

RUN apt-get install -y mongodb-clients

并使用:

构建它
docker build -t node-mongoclient . 

并将自己创建的文件替换为docker-compose.yml文件中的图像。

答案 1 :(得分:1)

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

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