Как я могу захватить стандартный вывод из докероде при использовании обещаний? - PullRequest
1 голос
/ 29 января 2020

Я пытаюсь запустить контейнер 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));

1 Ответ

2 голосов
/ 29 января 2020

Для docker.run(), потоки [process.stdout, process.stderr] - это то место, куда передаются базовые данные stdio.

Измените эти аргументы на доступные для записи потоки, которыми вы управляете. Вы можете использовать что-то вроде потока памяти , файла или реализовать stream самостоятельно.

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))
...