我想知道如何改变下面的行为。假设我的终端有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实现,但我遇到了同样的错误。
有没有人知道这可能是什么,如何解决?
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/c42fd5c4eb79c06fd7f9912b8359022f7d93887afbb33b57a67ed8bb7bfee43a/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