Skip to content

exec Stream Doesn't Emit End Event #534

@DavidRusso

Description

@DavidRusso

I want to execute a command in an already running container using "exec". For some reason, the stream returned by "exec.start()" is not emitting the "end" event. So, I have no way of knowing when the command completes and the Node process doesn't end.

Example code is below. Am I doing something wrong, or is this a bug?

const Docker = require("dockerode");
const docker = new Docker();
const PassThrough = require("stream").PassThrough;

(async () => {

  try {

    // Create/start container, if necessary.
    let container = docker.getContainer("test");
    let info;
    try {

      info = await container.inspect();

    }
    catch (error) {

      if (error.statusCode !== 404)
        throw error;
      container = await docker.createContainer({
        Image: "ubuntu",
        Tty: true,
        name: "test"
      });

    }
    info = await container.inspect();
    if (info.State.Running !== true)
      await container.start();

    // Execute 'cat' with data piped to stdin.
    const exec = await container.exec({
      AttachStdin: true,
      AttachStdout: true,
      AttachStderr: true,
      Tty: false,
      Cmd: ["cat"]
    });
    const stream = await exec.start({
      hijack: true,
      stdin: true
    });
    const input = new PassThrough();
    input.write("test one\ntest two\n");
    input.pipe(stream.output);
    docker.modem.demuxStream(stream.output, process.stdout, process.stderr);

    stream.output.on("end", async () => { // Event is not emitted.

      console.log(await exec.inspect());

    });

  }
  catch (error) {

    console.error(error);

  }

})();

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions