簡體   English   中英

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

[英]How to run a command in a container using Docker Compose?

我遇到以下情況:我有一個使用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容器中。 如果您不想創建自己的圖像,則可以使用以下圖像:

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文件。

如果工作如此繁重,則另一種方法是為其創建單獨的服務,即,另一個與Node應用共享一個卷的容器(以便它可以獲取文件)以及一個包含mongoimport和一個小應用程序,可讓您與Node應用程序進行通信(http或pub / sub等)。 該模型非常不錯,因為您可以從主應用程序以及數據庫中提取實際功能(mongoimport,無論如何)。

對於http服務,您可以使用Node或其他任何東西,是的,某種API會很好。 對於發布/訂閱,您可以將Redis與Node一起使用,這是一個非常輕量級的示例。 它將允許您有權訪問Redis客戶端的任何服務參與。 當然,如果您更喜歡Mongo,也可以使用它,但是Redis pub / sub非常簡單。 您遇到的一件事是,您需要確保文件已完全上傳,然后再通知您的服務以進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM