IoctlGetWinsize为Docker TTY容器中的宽度和高度返回零

92vpleto  于 2022-12-29  发布在  Docker
关注(0)|答案(1)|浏览(105)

我正在以交互方式运行一个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谢谢。
应获取终端大小。

zvokhttg

zvokhttg1#

答案比我想象的要简单。管理容器的进程需要将大小信息从主机转发到容器,包括resize事件。现在看起来有点明显,但花了一点时间才弄明白。

相关问题