我正在以交互方式运行一个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 terminal\n%w", err)
}
defer terminal.Restore(fd, oldState)
}
问题代码,当在Docker外部运行时检索终端大小没有问题,但是在Docker内部调用成功没有错误,但是响应好像不是一个0维的TTY。2任何帮助都是感激的。3谢谢。
应获取终端大小。
1条答案
按热度按时间zvokhttg1#
答案比我想象的要简单。管理容器的进程需要将大小信息从主机转发到容器,包括resize事件。现在看起来有点明显,但花了一点时间才弄明白。