当前位置: 首页 > 知识库问答 >
问题:

Docker在Docker内部更改的终端中的行数

海景曜
2023-03-14

我想知道如何改变下面的行为。假设我的终端有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.04tput lines时,它总是给出24,而不管终端的大小如何。这不仅是在ubuntu容器中,我也尝试了debian(Docker run--rm-it debian tput lines),得到了同样的结果24。

这样做的目的是使用mdp表示工具,该工具考虑到终端中的线路。当我的实现失败时,我尝试了其他人的docker实现,但我遇到了同样的错误。

有没有人知道这可能是什么,如何解决?

共有1个答案

盖诚
2023-03-14

2018年9月更新:检查docker 18.06是否存在相同的问题(在Moby/Moby问题33794之后,以及Moby/Moby问题35407和PR 37172之后,不应该存在相同的问题,这是18.06发行说明的一部分)。

2016年:

Ubuntu Dockerfile包括:

CMD ["/bin/bash"]

但这在命令行中不起作用:

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”用的:

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在下面评论的那样:

鉴于sleep的成功,我怀疑docker使用running命令旋转容器,一旦启动,客户端就附加到正在运行的容器。通常需要几毫秒的时间。

这给了我另一个想法:

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

thajeztah在评论中补充说:

创建容器,然后以默认值(80x24)启动,然后(当-it)附加会话。
会话指定终端的大小;

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

 DEBU[0244] Calling POST /v1.25/containers/c42fd5c4eb79c06fd7f9912b8359022f7d93887afbb33b57a67ed8bb7bfee4‌​3a/resize?h=46&w=221 

这实际上已经在运行时规范(opencontains/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ël Laventure(Mlaventure)已经在上面了,一个新的补丁可以使它达到Docker1.13。

 类似资料:
  • 如何在docker容器中运行基于的测试用例? 我有一个简单的Spring Boot应用程序,它具有集成测试(组件级),使用与容器交互。测试用例正在破坏来自外部容器(本地机器)的罚款。 我们正在容器中运行所有内容,并且build正在docker jenkins映像上运行。Docker文件正在创建jar,然后创建image。找不到安装的docker。下面是我的docker文件。 处理这个案子最好的办法

  • 我想要dockerise的遗留web应用程序使用一些旧的类,如,这些类在Java SE7之前一直受到支持。现在,在docker容器中,默认的jdk获取(在安装tomcat-6容器时)是 OpenJdk不支持这些类

  • 问题内容: 我在Docker容器中运行Jenkins。我想知道Jenkins容器也可以作为Docker主机吗?我正在考虑的是从Jenkins内部为每个集成测试构建启动一个新的Docker容器(以启动数据库,消息代理等)。因此,在完成集成测试后应关闭容器。是否有理由避免以这种方式从另一个Docker容器内部运行Docker容器? 问题答案: 如果可能,应尽可能避免在Docker内部运行Docker(

  • 我在Docker的容器里运行Jenkins。我想知道是否可以让Jenkins容器也作为Docker主机?我考虑的是从Jenkins内部为每个集成测试构建启动一个新的docker容器(启动数据库、消息代理等)。因此,容器应该在集成测试完成后关闭。有没有理由以这种方式避免从另一个docker容器内部运行docker容器?

  • 我正在下运行 在执行之后,终端(putty)大小更改。 前给出后

  • 问题内容: 在泊坞窗中,我想这样做: 但是,因为没有cd命令,所以每次都必须传递完整路径(使XYZ / fullpath)。有什么好的解决方案吗? 问题答案: 您可以运行脚本,也可以运行更复杂的参数。这是我先前下载的Dockerfile中的示例: 由于使用了“ &&”,如果所有先前的命令都成功,它将仅到达最终的“ pip install”命令。 实际上,由于每个RUN都会创建一个新的提交和AUFS