从Node.js中的docker容器获取stdout和stderrstream

我正在使用dockerode库,我想创build一个容器,执行一个单一的命令,并(单独)返回该命令的标准输出和标准错误。

到目前为止,我能够得到stdout ,但我没有与stderr的运气。 我在Github的问题中find了很多方法,但是没有一个能够工作。

我有的代码是(我使用承诺和协程来避免callback):

 const Promise = require('bluebird'); const coroutine = Promise.coroutine; const Docker = require('dockerode'); const docker = coroutine.promisifyAll(new Docker()); const foo = coroutine(function*(){ let container = Promise.promisifyAll(yield docker.createContainerAsync(/*...*/)); yield container.startAsync(/*...*/); const execOpts = {Cmd: /*...*/, AttachStdout: true, AttachStderr: true, Tty: true}; const exec = Promise.promisifyAll(yield container.execAsync(execOpts)); const stream = yield exec.startAsync(); let data = []; stream.on('data', chunk => { data.push(chunk); }); stream.on('end', () => { stdoutData = Buffer.concat(data).toString() }); let executionData = yield exec.inspectAsync(); while (executionData.Running) { executionData = yield exec.inspectAsync(); } return { stdout: stdoutData, stderr: } }); 

注意 :在dockerode的npm文档中有这样的例子来实现我想要的,但是我找不到全局对象process是什么以及如何在我的代码中使用它:

 //tty:true docker.createContainer({ /*...*/ Tty: true /*...*/ }, function(err, container) { /* ... */ container.attach({stream: true, stdout: true, stderr: true}, function (err, stream) { stream.pipe(process.stdout); }); /* ... */ } //tty:false docker.createContainer({ /*...*/ Tty: false /*...*/ }, function(err, container) { /* ... */ container.attach({stream: true, stdout: true, stderr: true}, function (err, stream) { //dockerode may demultiplex attach streams for you :) container.modem.demuxStream(stream, process.stdout, process.stderr); }); /* ... */ } docker.createImage({fromImage: 'ubuntu'}, function (err, stream) { stream.pipe(process.stdout); }); 

只需使用.demuxStream :

 demuxStream - demux stdout and stderr //demuxStream(stream, stdout, stderr) container.attach({ stream: true, stdout: true, stderr: true }, function handler(err, stream) { //... container.modem.demuxStream(stream, process.stdout, process.stderr); //... }); 

过程对象是表示当前进程的全局variables:

过程对象是一个全局的对象,提供有关当前Node.js过程的信息并对其进行控制。

process.stderr和process.stdout是表示当前进程的可写入stream STDOUT和STDERR:

process.stderr属性返回连接到stderr(fd 2)的stream。 它是一个net.Socket(它是一个Duplexstream),除非fd 2指向一个文件,在这种情况下它是一个Writablestream。

process.stdout属性返回一个连接到stdout(fd 1)的stream。 它是一个net.Socket(它是一个Duplexstream),除非fd 1指向一个文件,在这种情况下它是一个可写的stream。

即上面的例子只是将容器的streamredirect到当前进程的STDERR和STDOUT。 但是您可以自由使用任何其他可写入stream。