我正在将我们的一个Node应用程序进行Docker化。该应用程序的一个特性是,在启动时,该应用程序使用mongoexport下载mongodb数据并写入文件。
我使用child_process spawn来执行此操作。
我使用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”时,应用程序启动并正常工作。
然而,当我将这个node应用程序docker化后尝试运行时,出现了“Error: spawn mongoexport ENOENT”的错误信息。
我在一个容器中运行mongodb,在另一个容器中运行与mongodb容器链接的node应用程序。
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);
});
没问题,它运行得很好。
所以,我的结论是在nodejs docker容器中命令'mongoexport'不可用。
有人有想法如何实现这一点吗?或者这不可能做到吗?
以下是我参考的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 中看到。虽然根据 mongoexport 3.0.0 的文档 I see--type=csv
是正确的方式。 - fedorqui