bash - Docker número de líneas en el terminal que cambia dentro de la ventana acoplable
tput (4)
ACTUALIZAR
Ahora puede instalar la herramienta de línea de comandos de goinside
con:
sudo npm install -g goinside
e ir dentro de un contenedor docker con un tamaño de terminal adecuado con:
goinside docker_container_name
Lógica detrás de goinside
Gracias a la respuesta de @VonC , tenemos una solución para este problema con un simple fragmento de bash que colocamos en ~/.profile
:
goinside(){
docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside
ahora puede entrar en un contenedor de la ventana acoplable sin problemas de tamaño de terminal con:
$ goinside containername
recuerde la source ~/.profile
antes de usar la función goinside
.
habilitando autocompletar en bash
(como se comparte en uno de los comentarios a continuación) si desea habilitar la función de autocompletar para goinside
a goinside
, puede usar este fragmento de .profile
en .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;
habilitando el autocompletado en zsh
Si está usando zsh
como su terminal predeterminado, puede usar este fragmento dentro de su archivo ~/.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;
Me gustaría saber cómo cambiar el siguiente comportamiento. Digamos que mi terminal tiene 28 líneas. Luego uso los siguientes comandos:
$ 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
Como puede ver, incluso cuando todos los resultados deberían ser 28 , cuando llamo al contenedor como " docker run --rm -it ubuntu:16.04 tput lines
, siempre me da 24 a pesar del tamaño de mi terminal. Esto no es solo con el contenedor de ubuntu, también lo intenté con debian ( docker run --rm -it debian tput lines
) y tengo el mismo resultado 24.
El propósito de esto es utilizar la herramienta de presentación mdp que tiene en cuenta las líneas en su terminal. Cuando mi implementación falló, probé la implementación de la ventana acoplable de otra persona pero corrí con el mismo error.
Aquí está mi error en una imagen:
¿Alguien tiene alguna idea de lo que podría ser y cómo se puede resolver?
Actualización de septiembre de 2018: compruebe si la ventana acoplable 18.06 tiene el mismo problema ( no debería ).
2016:
El Ubuntu Dockerfile incluye:
CMD ["/bin/bash"]
Eso significa que el ENTRYPOINT
predeterminado es sh -c
(y dudo que la tput line
funcione bien en una sesión sh
, ya que tput usa la terminfo
datos terminfo
, que podría configurarse solo para bash en esa imagen)
Puede intentar sobrescribir ENTRYPOINT
con bash -c
y comprobar si funciona mejor.
Eso no funciona desde la línea de comandos sin embargo:
docker run --entrypoint /bin/bash --rm -it ubuntu:16.04 -i -c ''tput lines''
24
Comprobaré la opción de definir una imagen personalizada.
FROM ubuntu:16.04
ENTRYPOINT ["/bin/bash", "-c"]
El resultado es el mismo aunque:
docker run --rm -it u ''tput lines''
24
Esto sin embargo "funciona":
FROM ubuntu:16.04
ENTRYPOINT [ "/bin/bash" ]
Con:
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
Puede haber un problema de sincronización, ya que el mismo comando devuelve 24 de vez en cuando.
En realidad, lo siguiente siempre devuelve "no 24" con:
FROM ubuntu:16.04
ENTRYPOINT [ "/bin/bash", "-l", "-i", "-c" ]
docker run --rm -it u -c ''sleep 0.1; ls; tput lines''
48
El propone en los comentarios :
docker run --rm -it --entrypoint /bin/bash ubuntu:16.04 -c "sleep 0.1 && tput lines"
Como BMitch comenta a below :
Dado el éxito de la suspensión, mi sospecha es que la ventana acoplable gira el contenedor con el comando en ejecución y, una vez, el cliente se conecta al contenedor en ejecución. Típicamente algo que lleva milisegundos.
Eso me dio otra idea:
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
Un tput lines
dentro de una sesión adjunta funciona bien.
(En el alias drmae
, consulte " Cómo eliminar imágenes de Docker antiguas y no utilizadas ")
thajeztah añade en los comentarios :
se crea el contenedor, luego se inicia con los valores predeterminados (
80x24
), y después de eso (cuando-it
), se adjunta una sesión.
La sesión está especificando el tamaño del terminal;
Consulte " Cambiar el tamaño de un contenedor TTY " API.
DEBU[0244] Calling POST /v1.25/containers/c42fd5c4eb79c06fd7f9912b8359022f7d93887afbb33b57a67ed8bb7bfee43a/resize?h=46&w=221
Para más información, vea el número de Docker 25450 .
Está relacionado con el problema 10341 "La creación o el inicio del contenedor debe aceptar parámetros de altura / anchura" . Aleksa Sarai (cyphar) agrega ( septiembre de 2016 ):
Esto realmente ha vuelto a aparecer dentro del runtime-spec ( opencontainers / runtime-spec PR 563 ).
Básicamente, dado que Windows requiere la capacidad de establecer el tamaño de la consola en el primer inicio, podríamos terminar agregándolo para todas las plataformas .
El apunta al código en 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()
}
Con la pregunta lógica:
¿Tendría sentido usar esta propiedad en Linux también, y establecer el tamaño de la consola inicial con ese valor?
Kenfe-Mickaël Laventure ( mlaventure
) está en él, y un nuevo parche podría llegar a Docker 1.13 .
Los comentarios sobre sh
versus terminfo son en gran medida irrelevantes. La parte relevante (no clara en la respuesta dada) es la forma en que se ejecuta el comando. tput
comprueba tres características en el siguiente orden (usando setupterm
):
- el tamaño del terminal de la base de datos terminfo (muchas descripciones no proporcionan esta información, pero con
TERM=xterm
, es de 24 por 80 ), - el número real de líneas si puede obtener esa información del sistema operativo (es decir, el tamaño de la ventana actual ), y
- Las variables de entorno
LINES
yCOLUMNS
.
Un comando que se ejecuta sin un shell interactivo podría ejecutarse de una manera que impida obtener el tamaño de ventana actual . Por ejemplo, esa es una característica de ssh
(la opción -t
). Además, sería posible (aunque sin sentido) para Docker establecer las variables LINES
y COLUMNS
.
Cualquiera de los casos (1) o (3) es suficiente para explicar el comportamiento; La introducción de retrasos y carreras no hace eso.
Se ha corregido en la ventana acoplable 18.06: https://github.com/moby/moby/issues/33794#issuecomment-406814439