2016-07-18 97 views
0

我有以下情況:我有一個使用MongoDB的Node.js應用程序,因此使用Docker Compose,我可以有兩個容器:一個用於Node應用程序,另一個用於MongoDB。如何使用Docker Compose在容器中運行命令?

現在,該應用程序必須支持以下功能:可以上傳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是比節點應用的另一個容器內!

現在該如何解決?我想通過exec使用ssh在Mongo容器上運行它,但我不確定它。

如何從節點應用程序將mongoimport運行到Mongo容器中?

+0

您可以在Node.js容器中安裝mongo工具/客戶端以使用mongoimport並指定MongoDB主機。但似乎沒有exec的基於Node的解決方案可能會更清潔。部分取決於您對csv數據和這些文件的性質(大小,複雜程度等)所做的工作。 – ldg

+0

由於效率的原因,我避免了基於節點的解決方案。我正在導入一個類似250千行或更多行的文件。使用mongoimport,數據幾乎是瞬間導入的,而使用Node.js則需要一些時間。現在,要安裝這些mongo工具,我需要向dockerfile添加一些'apt-get'語句? – user1620696

+0

是的 - 如果工作很繁重,另一種方法是爲它創建一個服務,也就是與Node應用共享一個卷的容器(因此它可以獲取文件)和構建規範(Dockerfile),其中包括mongoimport和一個小應用程序,它允許您與Node應用程序(http或pub/sub等)進行通信。這個模型很好,你可以從你的主應用程序和數據庫中抽象出實際的功能(mongoimport,無論)。 – ldg

回答

1

我會將所需的工具安裝到我的Node.JS容器中。如果你不希望創建自己的圖像,你可以用這一個:

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

包括:

  • Mongoclient工具
  • 的Node.js /鮑爾和步兵

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

FROM image:latest 

RUN apt-get install -y mongodb-clients 

,並建立它:

docker build -t node-mongoclient . 

,並在你的搬運工,compose.yml文件替換的形象創造一個自我。

1

如果工作很繁重,另一種方法是爲它創建一個單獨的服務,即與Node應用程序共享一個卷(以便它可以獲取文件)的另一個容器以及構建規範(Dockerfile)其中包括mongoimport和一個小應用程序,可讓您與Node應用程序(http或pub/sub等)進行通信。這個模型很好,你可以從你的主應用程序和數據庫中抽象出實際的功能(mongoimport,無論)。

對於http服務,您可以使用Node或其他任何東西,並且是的,某種API會很好。對於pub/sub,您可以使用Redis和Node作爲一個非常輕量級的示例。它將允許您有權訪問Redis客戶端的任何服務參與。當然,如果你更熟悉Mongo,也可以使用Mongo,但Redis pub/sub非常簡單。在你的情況下,你需要確保文件已經完全上傳,然後通知你的服務才能正常工作。

相關問題