我想知道如何更改以下行为。假设我的终端有 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 presentation tool这考虑了终端中的线路。当我的实现失败时,我尝试了其他人的 docker implementation但我遇到了同样的错误。
这是我在图像中的错误:
有谁知道它可能是什么以及如何解决这个问题?
最佳答案
更新
您现在可以安装 goinside
命令行工具:
sudo npm install -g goinside
然后进入具有适当终端大小的 docker 容器:
goinside docker_container_name
goinside 背后的逻辑
感谢 @VonC answer我们用一个简单的 bash 片段解决了这个问题,我们把它放在 ~/.profile
中:
goinside(){
docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside
现在您可以进入 docker 容器,而不会出现终端大小问题:
$ goinside 容器名称
在使用
goinside
函数之前记住 source ~/.profile
。
在 bash 中启用自动完成
(因为它在下面的评论之一中共享)如果你想为 goinside
启用自动完成,你可以在 .profile
中使用这个片段:
goinside(){
docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
_goinside(){
COMPREPLY=( $(docker ps --format "{{.Names}}" -f name=$2) );
}
complete -F _goinside goinside;
export -f goinside;
在 zsh 中启用自动完成
如果您使用 zsh
作为默认终端,则可以在 ~/.zshrc
文件中使用此代码段:
autoload bashcompinit
bashcompinit
goinside(){
docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
_goinside(){
COMPREPLY=( $(docker ps --format "{{.Names}}" -f name=$2) );
}
complete -F _goinside goinside;
export goinside;
关于bash - Docker 终端中的 Docker 行数在 docker 内部发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38786615/