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

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

现在,该应用程序必须支持以下function:可以上传一个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容器?

我会安装所需的工具到我的Node.JS容器。 如果你不想创build自己的图像,你可以使用这个:

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

包含:

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

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

 FROM image:latest RUN apt-get install -y mongodb-clients 

并build立它:

 docker build -t node-mongoclient . 

并在自己创build的Docker-compose.yml文件中replace图像。

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

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