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 的实际输出。因此,阅读所有其他响应可以防止这种回声。不过仍在寻找更好的解决方案。
我想弄清楚为什么 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 的实际输出。因此,阅读所有其他响应可以防止这种回声。不过仍在寻找更好的解决方案。