1

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

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

        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 后,我​​注意到如果我/bin/sh通过cmd参数启动 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);
    })


4

1 回答 1

0

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

于 2021-04-08T04:42:37.093 回答