2018年9月更新:检查docker 18.06是否存在相同问题(不应该有, 在moby/moby
问题33794之后,还有moby/moby
问题35407和PR 37172, 是18.06版本说明的一部分)。
2016年:
Ubuntu Dockerfile包括:
CMD ["/bin/bash"]
这意味着默认的
ENTRYPOINT
是
sh -c
(我怀疑在
sh
会话中
tput line
无法正常工作,因为
tput使用
terminfo
数据库,该数据库可能仅针对该镜像中的bash设置)。您可以尝试用
bash -c
覆盖
ENTRYPOINT
并检查是否效果更好。但是从命令行不起作用:
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
在已连接的会话中运行得很好。
(关于drmae
别名,请参见“如何删除旧的和未使用的Docker镜像”)
thajeztah在评论中添加内容:
容器被创建后,使用默认设置(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
中的代码:
if runtime.GOOS == "windows" {
hostConfig.ConsoleSize[0], hostConfig.ConsoleSize[1] = dockerCli.GetTtySize()
}
针对这个逻辑问题:
在Linux上使用该属性并使用该值设置初始控制台大小是否有意义?
Kenfe-Mickaël Laventure (mlaventure
)正在处理,新的补丁可能会出现在Docker 1.13中。
_goinside(){ COMPREPLY=( $(docker ps --format "{{.Names}}" -f name=$2) ) }
然后导出它complete -F _goinside goinsid
- Shiplu Mokaddim