运行 dockerized 节点应用程序时出现“错误:spawn mongoexport ENOENT”

Posted

技术标签:

【中文标题】运行 dockerized 节点应用程序时出现“错误:spawn mongoexport ENOENT”【英文标题】:"Error: spawn mongoexport ENOENT" when running dockerized node app 【发布时间】:2016-12-28 18:53:58 【问题描述】:

我正在对我们的一个节点应用程序进行 docker 化。此应用程序的功能之一是,在开始时,该应用程序使用 mongoexport 下载 mongodb 数据并写入文件。

我正在使用 child_process spawn 进行此操作

var spawn = require('child_process').spawn;
var mongoExport = spawn('mongoexport', [
                 '--db', 'dbname', '--collection', 'collection1',
                 '--fields',
                 'name,address,city,country,pincode',
                 '--type', 'csv'
             ]);

当我从命令提示符运行“node app.js”时,应用程序启动并正常工作。

但是,当我将此节点应用程序 docker 化并尝试运行时,我得到“错误:spawn mongoexport ENOENT”。

我在一个容器中运行 mongodb,并在另一个容器中运行节点应用程序与 mongodb 容器链接

docker run --restart=always --name mongo-rnd -v /opt/mongo_rnd:/data/db -d mongo:3.2.7

docker run -e "MONGO_HOST=mongo-rnd" -p 8081:8081 -d --name nodeapp --link mongo-rnd:mongo-rnd nodeappimageid

我已尝试以下方法来调试此问题,

    我通过注释掉 mongoexport 功能进行了检查,一切正常。 我想,这可能是 docker 容器内的 child_process 问题。所以,我尝试了一个简单的“ls”命令
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', function(data)
  console.log("stdout:" + data);
);

没问题,效果很好。

所以,我的结论是命令 'mongoexport' 在 nodejs docker 容器中不可用。

有人知道如何实现这一目标吗?还是不能这样做?

这是我的 docker 文件供参考

FROM node:wheezy

RUN mkdir -p /usr/src/temp

COPY . /usr/src/temp

WORKDIR /usr/src/temp
RUN npm install

ENV PORT=8081
ENV MONGO_HOST "localhost"

EXPOSE 8081
CMD node app.js

【问题讨论】:

难道--type 是多余的,而仅--csv 就足够了吗?见于mongoexport with parameters + node.js + child process。虽然 I see from mongoexport 3.0.0 --type=csv 是正确的方法。 是的。你是对的。 --type 在最新的 mongo 中无法识别(我正在使用 3.2.7 进行测试)。足以指定为 --csv 【参考方案1】:

我猜对了,问题是 nodeapp 容器中没有安装“mongodb”。

我所要做的就是在 Dockerfile 中添加以下行以在 nodeapp 容器中安装 mongodb

RUN apt-get update 
RUN apt-get install -y mongodb

从我必须在 mongoexport 调用中指定 --host--port 的代码:

var mongoExport = spawn('mongoexport', [
                 '--db', 'dbname', '--host', 'mongo-rnd', '--port', 27017, '--collection', 'collection1','--fields', 'name,address,city,country,pincode',
                 '--csv']);

【讨论】:

以上是关于运行 dockerized 节点应用程序时出现“错误:spawn mongoexport ENOENT”的主要内容,如果未能解决你的问题,请参考以下文章

在 Docker Toolbox 中运行 Java 应用程序时出现 SunCertPathBuilderException

Docker 容器在运行 php 应用程序时出现 503 错误

使用 rust 二进制文件运行 docker 映像时出现权限被拒绝错误

使用 spring 和 docker 引发运行时异常时出现 cors 问题

DB2问题,程序运行时不定时出现以下sql报错问题!

使用 laravel 微风运行 npm 时出现节点错误