【问题标题】:How to run a command in a container using Docker Compose?如何使用 Docker Compose 在容器中运行命令?
【发布时间】:2016-07-23 03:50:28
【问题描述】:

我有以下情况:我有一个使用 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 容器中?

【问题讨论】:

  • 您可以在 Node.js 容器中安装 mongo 工具/客户端以使用 mongoimport 并指定 MongoDB 主机。但似乎没有 exec 的基于节点的解决方案可能更干净。部分取决于您对 csv 数据的处理方式以及这些文件的性质(大小、复杂性等)。
  • 出于效率考虑,我一直在避免使用基于节点的解决方案。我正在导入一个包含 25 万行或更多行的文件。使用 mongoimport 几乎可以立即导入数据,而使用 Node.js 则需要一些时间。现在,要安装这些 mongo 工具,我需要在 dockerfile 中添加一些 apt-get 语句,对吗?
  • 是的 - 如果工作很繁重,另一种方法是为它创建一个服务,即另一个与 Node 应用程序共享卷的容器(以便它可以获取文件)和一个构建规范(Dockerfile),包括 mongoimport 和一个允许您与 Node 应用程序(http 或 pub/sub 等)通信的小应用程序。这个模型很好,因为您可以从主应用程序以及数据库中抽象出实际功能(mongoimport,等等)。
  • 感谢@Idg 的评论,我喜欢你建议的这个解决方案。您提到的http 方式是创建一个简单的Web api,它等待特定端点中的请求,并在此类请求中使用卷上的数据执行导入,对吗?现在,我已经阅读了一些关于 pub/sub 的信息,但从未有机会在实践中看到它,因此我想了解如何使用 pub/sub 来做到这一点。你能告诉我这将如何进行吗?我该如何开始使用它来实施这个解决方案?
  • 添加为答案,包括更多详细信息以回答您的上述问题。

标签: node.js mongodb docker


【解决方案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 文件中的图像替换为自己创建的图像。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多