如何使用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是非常简单的。 在你的情况下,你要确保文件已经完全上传,然后通知你的服务才能工作。