我正在交互式地运行docker容器,该实例由所有帐户都是TTY,但我似乎无法使用ioctl(特别是从golang.org/x/sys/unix/ioctl.go调用golang的IoctlGetWinsize)获得终端尺寸。
一些细节,相关的容器选项是(对于container. config):
AttachStdin: true,
AttachStdout: true,
AttachStderr: true,
OpenStdin: true,
Tty: true,
StdinOnce: true,
和调用ContainerAttach时:
resp, err := cli.ContainerAttach(noCtx, containerName, types.ContainerAttachOptions{
Stream: true,
Stdin: true,
Stdout: true,
Stderr: true,
})
然后转发i/o
go io.Copy(os.Stderr, resp.Reader)
go io.Copy(os.Stdout, resp.Reader)
go io.Copy(resp.Conn, os.Stdin)
fd := int(os.Stdin.Fd())
var oldState *terminal.State
if terminal.IsTerminal(fd) {
oldState, err = terminal.MakeRaw(fd)
if err != nil {
return fmt.Errorf("Unable to make raw terminaln%w", err)
}
defer terminal.Restore(fd, oldState)
}
有问题的代码,当在docker外运行时检索终端大小没有问题,但是在docker内,调用成功,没有错误,但响应好像不是一个0维的TTY。任何帮助都是感激的。谢谢。
期望得到终端尺寸。
答案比我想象的要简单。管理容器的进程需要将大小信息从主机转发到容器,包括调整大小事件。现在看起来似乎很明显,但花了一点时间才弄清楚。