[英]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/
包含:
如果要構建自己的映像,請包括:
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.