4

我正在尝试按照此处的示例使用 dockerode 运行 docker 容器。

我遇到的问题是容器的输出打印到标准输出,但我试图捕获它并将其存储在一个变量中,同时尽可能使用承诺。

我的代码是:

const Docker = require('dockerode');

const docker = new Docker();

docker
    .run(
        'wappalyzer/cli',
        ['https://www.wappalyzer.com'],
        [process.stdout, process.stderr],
        { Tty: false }
    )
    .then((data) => {
        let output = data[0];
        let container = data[1];
        console.log(typeof output);
        console.log(output);
        return container.remove();
    })
    .catch((error) => console.log(error));
4

1 回答 1

3

对于docker.run(), [ process.stdout, process.stderr] 流是底层 stdio 数据通过管道传输到的地方。

将这些参数更改为您控制的可写流。您可以使用诸如内存流文件或自己实现之类的东西。

const Docker = require('dockerode')
const streams = require('memory-streams')

const docker = new Docker()
const stdout = new streams.WritableStream()
const stderr = new streams.WritableStream()

docker.run(
    'debian:10',
    ['sh', '-c', 'echo test; echo testerr >/dev/stderr; echo test3'],
    [stdout, stderr],
    { Tty: false }
  )
  .then(([ res, container ]) => {
      console.log(res)
      console.log('stdout: %j', stdout.toString())
      console.log('stderr: %j', stderr.toString())
      return container.remove()
  })
  .catch((error) => console.log(error))
于 2020-01-29T08:34:49.360 回答