Moby: Comportamiento extraño de la terminal dentro de Docker

Creado en 23 jun. 2017  ·  33Comentarios  ·  Fuente: moby/moby

Cuando ejecuto a / bin / bash dentro de la ventana acoplable (docker exec -ti container / bin / bash) y busco de forma recursiva un comando, a veces la terminal comienza a comportarse de manera extraña y todo se estropea como en la imagen.
Después de eso, tengo que salir del contenedor y ejecutar de nuevo.
selection_017

Comentario más útil

Descubrí que este error se debe a los parámetros de ancho y alto de la terminal que a veces no se proporcionan al contenedor con el comando docker exec

Puede leer más sobre esto en este número: # 10341

He resuelto el error de esta manera:

docker exec -e COLUMNS="`tput cols`" -e LINES="`tput lines`" -ti container bash

También puede poner este comando en un script y proporcionar el nombre del contenedor como parámetro y crear un alias como docker-exec

Todos 33 comentarios

Ctrl-P / Ctrl-N se comportan de manera extraña en mi caso y es molesto navegar por el historial de shell. Es posible que estemos preocupados por el mismo problema.

También he notado que navegar por el historial con la tecla arriba a veces reproduce este comportamiento.

Con frecuencia tengo problemas de terminal que parecen deberse a que Docker no averigua cuál es el tamaño de terminal correcto inicialmente. Esto parece suceder solo en una terminal nueva. (Esto puede ser o no lo que está causando su problema). Por ejemplo:

$ docker exec -it foo /bin/bash
foo<strong i="6">@649fb21d747c</strong>:~$ stty size
0 0
foo<strong i="7">@649fb21d747c</strong>:~$ reset -w
foo<strong i="8">@649fb21d747c</strong>:~$ stty size
24 80
foo<strong i="9">@649fb21d747c</strong>:~$ # That was still wrong. Now resize the terminal to get a SIGWINCH.
foo<strong i="10">@649fb21d747c</strong>:~$ stty size
69 208
foo<strong i="11">@649fb21d747c</strong>:~$ exit
exit
$ docker exec -it foo /bin/bash # Try it again.
foo<strong i="12">@649fb21d747c</strong>:~$ stty size
69 208
foo<strong i="13">@649fb21d747c</strong>:~$ # Doesn't happen anymore for this session.

Descubrí que este error se debe a los parámetros de ancho y alto de la terminal que a veces no se proporcionan al contenedor con el comando docker exec

Puede leer más sobre esto en este número: # 10341

He resuelto el error de esta manera:

docker exec -e COLUMNS="`tput cols`" -e LINES="`tput lines`" -ti container bash

También puede poner este comando en un script y proporcionar el nombre del contenedor como parámetro y crear un alias como docker-exec

¡Gracias @cromat! Esto resolvió un problema que tenía al usar Docker para Windows en Bash en Windows donde la salida no era lo suficientemente amplia debido a que no tenía un TTY adecuado. Parece que sus comillas invertidas se formatearon en código, así que aquí está la línea nuevamente:

docker exec -t container_name /bin/bash -c "export COLUMNS=`tput cols`; export LINES=`tput lines`; exec bash"

para cualquiera que venga aquí en busca de una respuesta, puede encontrarla aquí en stackoverflow

Gracias @PhilT.

Esto es lo que funcionó para mí.

docker exec -it container_name sh -c "stty rows 50 && stty cols 150 && bash"

¡Gracias! ¡Eso también resolvió el mío!

Después de probar una docena de soluciones, @PhilT 's fue la única que funcionó

Este es el enfoque más correcto. No es necesario un doble ejecutivo de bash.

docker exec -e COLUMNS="`tput cols`" -e LINES="`tput lines`" -ti container bash

La solución de @eigood funcionó a la

Yo uso ubuntu con gnome. Por lo general, cambio el tamaño de la ventana y el problema se resuelve solo.
Cambiar el tamaño en gnome es Ctrl+Super+(Down Arrow) y luego Ctrl+Super+(Up Arrow)

@eigood Gracias por la solución correcta. ¿Por qué Docker no hace esto?

@PhilT @cromat En mi caso, necesito la opción -i como en -it lugar de solo la opción -t .

Creé un alias para hacer mi vida más fácil.

alias dexec='docker exec -e COLUMNS="`tput cols`" -e LINES="`tput lines`" -ti $1'

P.ej.:

dexec containername_service_1 bash

@ romulo1984 ¿qué versión de Docker está ejecutando? esto debería arreglarse en la versión actual

@thaJeztah 17.12.0-ce

Esa versión llegó a EOL en marzo; Recomiendo actualizar a 18.06 (versión estable actual), que tiene la solución para esto

@thaJeztah gracias.

Puedo confirmar que este problema se resuelve con Docker 18.06.

@nodakai Tengo el mismo problema que tú: no tengo problemas con el ancho ni nada, pero Docker algo no se vuelve a dibujar. Específicamente, si uso ctrl-p y ctrl-n para desplazarme por el historial de bash (que es mi hábito), no se vuelve a dibujar. Si utilizo las teclas de flecha, lo hace.

¿Conseguiste encontrar una forma de solucionar este problema?

@Grazfather Creo que ese es un tema diferente. Creo que el problema es que la secuencia de teclas para desconectar de un contenedor es C-p C-q , por lo que la ventana acoplable ve su C-p y está esperando el C-q para desconectarse. En realidad no lo he intentado, pero podría ser que usar --detach-keys= pueda ayudar.

para cualquiera que venga aquí en busca de una respuesta, puede encontrarla aquí en stackoverflow

La respuesta vinculada aquí es la mejor solución en mi opinión porque otras soluciones no funcionan cuando cambia de usuario dentro del contenedor, asumiendo que desea el entorno del nuevo usuario que sobrescribirá las variables de entorno LINES y COLUMNS.

Yo uso xshell exec en Docker ..

image

cuando cambio el tamaño de la ventana xshell ...
image

el tamaño de exec tty se restableció correctamente ... alguien sabe por qué, y cómo lo hace xshell ... Trabajé en una versión inferior de la ventana acoplable

image

Ejemplo de Docker-compose para resolver este problema:

version: '3'
services:
    php:
        container_name: cmg-php
        hostname: "docker-stand"
        build:
            context: ./
        environment:
            - COLUMNS=`tput cols`
            - LINES=`tput lines`

Centrarse en el medio ambiente. @cromat gracias!

@frops su solución no es válida. la clave environment se usa para inicializar el entorno en el paso de creación de contenedor, por lo que no es la solución correcta. necesita valores de env establecidos durante la entrada del contenedor, no la creación.

además, como leí, @thaJeztah dijo que está arreglado en 18.06

Definitivamente debería mejorarse en 18.06 y versiones posteriores, pero todavía hay algunos casos en los que es posible que sea necesario volver a activar el cambio de tamaño (puede hacerlo cambiando el tamaño de la ventana de su terminal); hay una solicitud de extracción que agrega un bucle de reintento para esos casos, pero aún no se ha fusionado; https://github.com/docker/cli/pull/1529

Consideraría establecer COLUMNS y LINES una solución alternativa para algunas situaciones, pero no algo para mantener en su entorno

Encontré que el error todavía está presente si se ejecuta con --tty y sin --interactive .
Docker versión 18.09.2, compilación 6247962

Ejemplo para reproducir:

FROM debian
RUN apt-get update
RUN apt-get install -y sl
CMD /usr/games/sl

Comando con salida rota / tamaño de terminal incorrecto:
docker run --rm --tty slimage

https://github.com/docker/cli/pull/1529 aún no está en `Docker 18.09

se espera que se arregle en 19.03.0 (10 de julio de 2019)

Se volvió a portar a Docker CLI 18.09.5 a través de https://github.com/docker/cli/pull/1775

todavía se presenta en la última versión de Mac OS cuando se compila openwrt con el comando:
hacer menuconfig
y todas las soluciones anteriores no funcionan para las ventanas ncurses desordenadas

docker version

    Client: Docker Engine - Community
     Version:           19.03.1
     API version:       1.40
     Go version:        go1.12.5
     Git commit:        74b1e89
     Built:             Thu Jul 25 21:18:17 2019
     OS/Arch:           darwin/amd64
     Experimental:      false

    Server: Docker Engine - Community
     Engine:
      Version:          19.03.1
      API version:      1.40 (minimum version 1.12)
      Go version:       go1.12.5
      Git commit:       74b1e89
      Built:            Thu Jul 25 21:17:52 2019
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          v1.2.6
      GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
     runc:
      Version:          1.0.0-rc8
      GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
     docker-init:
      Version:          0.18.0
      GitCommit:        fec3683
docker version

    Client: Docker Engine - Community
     Version:           19.03.1
     API version:       1.40
     Go version:        go1.12.5
     Git commit:        74b1e89
     Built:             Thu Jul 25 21:18:17 2019
     OS/Arch:           darwin/amd64
     Experimental:      false

    Server: Docker Engine - Community
     Engine:
      Version:          19.03.1
      API version:      1.40 (minimum version 1.12)
      Go version:       go1.12.5
      Git commit:       74b1e89
      Built:            Thu Jul 25 21:17:52 2019
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          v1.2.6
      GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
     runc:
      Version:          1.0.0-rc8
      GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
     docker-init:
      Version:          0.18.0
      GitCommit:        fec3683

Hice yo mismo una configuración de VIM portátil con todos mis complementos de lujo para el estilo y el deshilachado / arreglo. Hasta que se me ocurrió la solución @cromat , siempre tuve problemas de diseño con VIM + NERDTree. Ahora funciona bien. Me acabo de hacer un alias (función, me gustan las funciones pero lo mismo aquí).

$ vi ~/.zshrc
function vim {
    docker run --env LINES=$(tput lines) --env COLUMNS=$(tput cols) # ... 
}
¿Fue útil esta página
0 / 5 - 0 calificaciones