码头工人在码头工人内部更改的Docker行数

Silgon:

我想知道如何更改以下行为。假设我的终端有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实现,但遇到了同样的错误。

这是我在图片中的错误:

码头工人在码头工人内部更改的Docker行数

有谁知道这可能是什么以及如何解决?

VonC:

2018年9月更新:检查docker 18.06是否存在相同的问题(发行33794之后,并且发行18407 发行说明的一部分中发行35407PR 37172之后也不应这样做)。moby/mobymoby/moby


2016年:

Ubuntu的Dockerfile包括:

CMD ["/bin/bash"]

这意味着默认值ENTRYPOINTsh -c(而且我怀疑tput linesh会话中效果很好,因为tput使用terminfo数据库,该数据库可能仅针对该图像中的bash设置)

你可以尝试覆盖ENTRYPOINTbash -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

OP silgon提出的意见

docker run --rm -it --entrypoint /bin/bash ubuntu:16.04 -c "sleep 0.1 && tput lines"

正如下面的BMitch评论

考虑到睡眠的成功,我怀疑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映像 ”)


thajeztah 在评论中添加

创建容器,然后从默认值(80x24开始,然后(当时-it)附加一个会话。
会话指定了终端的大小;

请参阅“ 调整容器TTY的大小 ” API。

 DEBU[0244] Calling POST /v1.25/containers/c42fd5c4eb79c06fd7f9912b8359022f7d93887afbb33b57a67ed8bb7bfee4‌​3a/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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章