我有以下情况:我有一个使用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容器中?
答案 0 :(得分:1)
我会将所需的工具安装到我的Node.JS容器中。如果您不想创建自己的图像,可以使用以下图像:
https://hub.docker.com/r/bitliner/nodejs-bower-grunt-mongodbclients/
,包括:
如果您想构建自己的图片,请添加:
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非常简单。在您的情况下,您要确保文件已完全上传,然后通知您的服务部门。