У меня есть следующая ситуация: у меня есть одно приложение Node.js, которое использует MongoDB, так что с Docker Compose у меня могут быть два контейнера: один для приложения Node и еще один для MongoDB.Как запустить команду в контейнере с помощью Docker Compose?
Теперь приложение должно поддерживать следующую функцию: можно загрузить файл csv
, который будет импортирован в Mongo, используя mongoimport
.
С Узлом, работает 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!
Теперь, как это можно решить? Я думал об использовании ssh through exec для запуска этого в контейнере Mongo, но я не уверен в этом.
Как я могу запустить mongoimport
из приложения Node в контейнер Mongo?
Вы можете установить инструменты/клиенты mongo в контейнере Node.js для использования mongoimport и указать узел MongoDB. Но похоже, что решение на основе Node без exec может быть более чистым. Отчасти зависит от того, что вы делаете с данными csv и характером этих файлов (размер, сложность и т. Д.). – ldg
Я избегал решения на основе узла из-за эффективности. Я импортирую файлы с чем-то вроде 250 тысяч и более строк. С mongoimport данные были импортированы почти мгновенно, а с Node.js требуется некоторое время. Теперь, чтобы установить эти инструменты mongo, мне нужно было бы добавить некоторое утверждение 'apt-get' в файл dockerfile? – user1620696
Да, если работа такая тяжелая, другой подход заключался бы в создании для нее службы, т. Е. В другом контейнере, который разделяет тома с приложением Node (так что он может получить файлы) и спецификацией сборки (Dockerfile), который включает mongoimport и небольшое приложение, которое позволяет вам общаться с приложением Node (http или pub/sub и т. д.). Эта модель хороша тем, что вы можете абстрагировать фактическую функциональность (mongoimport, что угодно) от вашего основного приложения, а также от db. – ldg