dockerode stream "data" 侦听器回显写入数据

dockerode stream "data" listener echoes write data

我想弄清楚为什么 dockerode 流将写入流的所有数据直接定向到流的输出。

这就是我创建容器的方式,我在 this.stream 对象上调用 .write() 方法。

        this.container = await this.dockerConnection.createContainer({
            Image: this.image,
            Tty: true,
            Cmd: cmd,
            HostConfig: {
                NetworkMode: "none",
                Binds: [this.mountPath + ":/home/appuser/workdir"],
            },
            OpenStdin: true,
            StdinOnce: false,
            AutoRemove: true,
        });

        this.stream = await this.container.attach({
            stream: true,
            stdin: true,
            stdout: true,
            stderr: true,
        });

        await this.container.start();

然而,在将此流连接到连接到 xterm.js 的 websocket 之后,我注意到我是否通过 cmd 参数启动了 /bin/sh 之类的 shell 并写入对于结果 this.stream,我 运行 的命令在 this.stream.on("data", ...) 侦听器上回显给我。

例如,如果我写 ls\n,传递到 .on("data",...) 的数据看起来像

ls
bin/ etc/ lib/ ... (etc.)

如何防止它向我回显“ls”?

这是在服务器上写入和读取流的代码:

    let sb = new Sandbox("alpine-sandbox");

    let stream = await sb.launchSHShell();

    stream.on("data", (data) => {
        socket.emit("response", data.toString());
    })

    socket.on("command", (cmd) => {
        stream.write(cmd);
    })


好的,我目前解决这个问题的方法是只阅读其他 on("data", ...) 个回复。我注意到数据侦听器被调用了两次,一次是针对我编写的命令,另一次是针对 shell 的实际输出。因此,阅读所有其他响应可以防止这种回声。不过仍在寻找更好的解决方案。