2016-07-18 10 views
0

私は次のような状況に陥っています。MongoDBを使用するNode.jsアプリケーションが1つあり、Docker Composeで2つのコンテナ(Nodeアプリケーション用とMongoDB用)を持つことができます。Docker Composeを使用してコンテナ内のコマンドを実行するには?

今、アプリはmongoimportを使用してMongoにインポートされるcsvファイルをアップロードすることができます。

ノードの場合、を実行すると、exec機能があるので、簡単です。それはそれのようなものをやっての問題になり、次のとおりです。

const exec = require('child_process').exec; 

exec('mongoimport -d database -c collection --type csv file.csv', function (error, stdout, stderr) { 
    // Other stuff here... 
}); 

唯一の問題は、次のとおりです。MongoDBのはノードアプリよりも、別の容器内にあるのでmongoimportは、使用できなくなります!

これはどのように解決できますか?私はexecを使ってsshを使ってMongoのコンテナでこれを実行することを考えましたが、私はそれについて確信していません。

ノードアプリケーションからmongoimportをMongoコンテナに実行するにはどうすればよいですか?

+0

Node.jsコンテナにmongoツール/クライアントをインストールして、mongoimportを使用してMongoDBホストを指定できます。しかし、execを使わないノードベースのソリューションはきれいに見えるかもしれません。部分的には、csvデータとそれらのファイルの性質(サイズ、複雑さなど)によって何をしているかによって異なります。 – ldg

+0

効率のためにノードベースのソリューションは避けていました。 250,000以上の行を含むファイルをインポートしています。 mongoimportでは、データはほとんど瞬時にインポートされ、Node.jsでは時間がかかりました。さて、これらのmongoツールをインストールするには、 'apt-get'文をドッカーファイルに追加する必要があります。 – user1620696

+0

ええ - 仕事がそれほど重いのであれば、もう一つのアプローチは、ノードアプリケーションとボリュームを共有する別のコンテナ(ファイルを取得できるようにする)とビルドスペック(Dockerfile)です。 mongoimportと、Nodeアプリケーション(httpやpub/subなど)と通信できる小さなアプリケーションです。このモデルは、あなたのメインアプリやdbからの実際の機能(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

ジョブが重い場合は、別の方法として、ノードアプリケーションとボリュームを共有する別のコンテナ(ファイルを取得できるようにする)とビルド仕様(Dockerfile)を作成する方法があります。これには、mongoimportと、Nodeアプリケーション(httpやpub/subなど)との通信を可能にする小さなアプリケーションが含まれています。このモデルは、あなたのメインアプリやdbからの実際の機能(mongoimportなど)を抽象化することができるという点で優れています。

httpサービスの場合は、Nodeなどを実際に使用することができますし、ある種のAPIを使用するとよいでしょう。 pub/subの場合は、かなり軽量になる例の1つとして、Redis with Nodeを使用することができます。 Redisクライアントにアクセスできるサービスがあれば参加できます。もちろん、Mongoをもっと快適に使うこともできますが、Redis pub/subはとても簡単です。あなたの場合の1つの事は、あなたのサービスがサービスを受けるように通知する前に、ファイルが完全にアップロードされていることを確認することです。

関連する問題