2018 年 9 月更新:检查 docker 18.06 是否有相同的问题(它不应该,在moby/moby
issue 33794之后,以及moby/moby
issue 35407和PR 37172,18.06发行说明的一部分)。
2016 年:
Ubuntu Dockerfile包括:
CMD ["/bin/bash"]
这意味着默认值ENTRYPOINT
是sh -c
(我怀疑在会话tput line
中效果很好,因为tput使用数据库,它可能只为该图像中的 bash 设置)sh
terminfo
您可以尝试覆盖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
OP silgon在评论中提出:
docker run --rm -it --entrypoint /bin/bash ubuntu:16.04 -c "sleep 0.1 && tput lines"
正如BMitch评论如下:
鉴于 sleep 的成功,我怀疑 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
) 启动,之后 (when -it
) 附加一个会话。
会话正在指定终端的大小;
请参阅“调整容器 TTY 的大小”API。
DEBU[0244] Calling POST /v1.25/containers/c42fd5c4eb79c06fd7f9912b8359022f7d93887afbb33b57a67ed8bb7bfee43a/resize?h=46&w=221
有关更多信息,请参阅docker 问题 25450。
它与问题 10341 "Container create or start should accept height/width params"相关。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ël Laventure ( mlaventure
)就在上面,一个新的补丁可以使它成为Docker 1.13。