我想知道如何更改以下行为。假设我的终端有28行。然后,我使用以下命令:
$ tput lines # my terminal
28
$ docker run --rm -it ubuntu:16.04 tput lines # docker container
24 ## WHY??
$ docker run --rm -it ubuntu:16.04 bash # docker container inside command
root@810effa2777c:/# tput lines
28
如您所见,即使所有结果都应该是28,当我调用容器时,docker run --rm -it ubuntu:16.04 tput lines
尽管终端的大小,它总是给我24。这不仅适用于ubuntu容器,我还尝试过使用debian(docker run --rm -it debian tput lines
),并且得到的结果相同24。
这样做的目的是使用mdp演示工具,该工具考虑了终端中的行。当我的实现失败时,我尝试了其他人的docker实现,但遇到了同样的错误。
这是我在图片中的错误:
有谁知道这可能是什么以及如何解决?
2018年9月更新:检查docker 18.06是否存在相同的问题(在发行33794之后,并且在发行18407 发行说明的一部分中发行35407和PR 37172之后,也不应这样做)。moby/moby
moby/moby
2016年:
CMD ["/bin/bash"]
这意味着默认值ENTRYPOINT
是sh -c
(而且我怀疑tput line
在sh
会话中效果很好,因为tput使用terminfo
数据库,该数据库可能仅针对该图像中的bash设置)
你可以尝试覆盖ENTRYPOINT
与bash -c
和检查,如果是工作得更好。
但是,这在命令行中不起作用:
docker run --entrypoint /bin/bash --rm -it ubuntu:16.04 -i -c 'tput lines'
24
我将检查定义自定义图像的选项。
FROM ubuntu:16.04
ENTRYPOINT ["/bin/bash", "-c"]
结果是一样的:
docker run --rm -it u 'tput lines'
24
但是,这“有效”:
FROM ubuntu:16.04
ENTRYPOINT [ "/bin/bash" ]
带有:
docker@default:/c/Users/vonc/prog/testsu$ docker run --rm -it u -i -c 'ls; tput lines'
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
48
可能存在同步问题,因为同一命令有时会返回24。
实际上,以下代码始终返回“ not 24”:
FROM ubuntu:16.04
ENTRYPOINT [ "/bin/bash", "-l", "-i", "-c" ]
docker run --rm -it u -c 'sleep 0.1; ls; tput lines'
48
docker run --rm -it --entrypoint /bin/bash ubuntu:16.04 -c "sleep 0.1 && tput lines"
考虑到睡眠的成功,我怀疑docker使用运行命令旋转容器,一旦运行,客户端将附加到正在运行的容器。通常需要几毫秒的时间。
那给了我另一个主意:
docker@default:/c/Users/vonc/prog/testsu$
docker run --entrypoint='/bin/bash' --name ub -d -it ubuntu:16.04
0d9b8783afbb5e3ff4232da071d3f357985351ea1ce4d142bf6617ac456fb76b
docker@default:/c/Users/vonc/prog/testsu$
d attach ub
root@0d9b8783afbb:/# tput lines
48
root@0d9b8783afbb:/# exit
exit
docker@default:/c/Users/vonc/prog/testsu$ drmae
0d9b8783afbb5e3ff4232da071d3f357985351ea1ce4d142bf6617ac456fb76b
tput lines
附加会话中的A 可以正常工作。
(关于drmae
别名,请参阅“ 如何删除旧的和未使用的Docker映像 ”)
创建容器,然后从默认值(
80x24
)开始,然后(当时-it
)附加一个会话。
会话指定了终端的大小;
请参阅“ 调整容器TTY的大小 ” API。
DEBU[0244] Calling POST /v1.25/containers/c42fd5c4eb79c06fd7f9912b8359022f7d93887afbb33b57a67ed8bb7bfee43a/resize?h=46&w=221
有关更多信息,请参阅docker问题25450。
与问题10341“容器创建或开始应接受高度/宽度参数”有关。Aleksa Sarai(cyphar)添加(2016年9月):
实际上,这实际上在运行时规范(opencontainers / runtime-spec PR 563)中再次弹出。
基本上,由于Windows要求能够在首次启动时设置控制台大小,因此我们最终可能会为所有平台添加控制台大小。
该OP silgon指出在代码api/client/container/run.go
:
// Telling the Windows daemon the initial size of the tty during start makes
// a far better user experience rather than relying on subsequent resizes
// to cause things to catch up.
if runtime.GOOS == "windows" {
hostConfig.ConsoleSize[0], hostConfig.ConsoleSize[1] = dockerCli.GetTtySize()
}
有逻辑的问题:
在Linux上也使用此属性并使用该值设置初始控制台大小是否有意义?
Kenfe-MickaëlLaventure(mlaventure
)就在上面,并且一个新的补丁程序可能会将其添加到Docker 1.13中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句