Moby: Comportamento estranho do terminal dentro do docker

Criado em 23 jun. 2017  ·  33Comentários  ·  Fonte: moby/moby

Quando exec para / bin / bash dentro do docker (docker exec -ti container / bin / bash) e procuro recursivamente para um comando, às vezes o terminal começa a se comportar de forma estranha e tudo bagunça como na imagem.
Depois disso, tenho que sair do container e executar novamente.
selection_017

Comentários muito úteis

Eu descobri que esse bug é realmente devido aos parâmetros de largura e altura do terminal que às vezes não são fornecidos ao container com o comando docker exec

Você pode ler mais sobre isso nesta edição: # 10341

Resolvi o bug desta forma:

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

Você também pode colocar este comando em um script e fornecer o nome do contêiner como parâmetro e criar um alias como docker-exec

Todos 33 comentários

Ctrl-P / Ctrl-N se comporta estranhamente no meu caso e é irritante navegar pelo histórico do shell. É possível que estejamos preocupados com o mesmo problema.

Também percebi que navegar pela história com a tecla para cima às vezes reproduz esse comportamento.

Freqüentemente tenho problemas de terminal que parecem se resumir ao Docker não descobrir qual é o tamanho correto do terminal inicialmente. Isso parece acontecer apenas em um terminal novo. (Isso pode ou não ser a causa do problema.) Por exemplo:

$ 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.

Eu descobri que esse bug é realmente devido aos parâmetros de largura e altura do terminal que às vezes não são fornecidos ao container com o comando docker exec

Você pode ler mais sobre isso nesta edição: # 10341

Resolvi o bug desta forma:

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

Você também pode colocar este comando em um script e fornecer o nome do contêiner como parâmetro e criar um alias como docker-exec

Obrigado @cromat! Isso resolveu um problema que eu estava tendo ao usar o Docker para Windows no Bash no Windows, em que a saída não era ampla o suficiente por não ter um TTY adequado. Parece que seus crases foram formatados em código, então aqui está a linha novamente:

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

para quem vem aqui em busca de uma resposta, você pode encontrá-la aqui no stackoverflow

Obrigado @PhilT.

Isto é o que funcionou para mim.

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

Obrigado! Isso resolveu o meu também!

Depois de tentar uma dúzia de soluções, a @PhilT 's foi a única que funcionou

Esta é a abordagem mais correta. Não há necessidade de double-exec de bash.

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

A solução da @eigood funcionou

Eu uso o Ubuntu com o gnome. Normalmente, eu redimensiono a janela e o problema é resolvido sozinho.
O redimensionamento no gnome é Ctrl+Super+(Down Arrow) e então Ctrl+Super+(Up Arrow)

@eigood Obrigado pela solução correta. Por que o Docker simplesmente não faz isso?

@PhilT @cromat No meu caso, eu preciso da opção -i como em -it vez de apenas a opção -t .

Criei um apelido para tornar minha vida mais fácil.

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

Por exemplo.:

dexec containername_service_1 bash

@ romulo1984 qual versão do docker você está executando? isso deve ser corrigido na versão atual

@thaJeztah 17.12.0-ce

Essa versão chegou à EOL em março; Eu recomendo atualizar para 18.06 (versão estável atual), que tem a correção para este

@thaJeztah obrigado.

Posso confirmar que esse problema foi resolvido com o Docker 18.06.

@nodakai Tenho o mesmo problema que você: não tenho problemas com largura nem nada, mas algo do Docker não é redesenhado. Especificamente, se eu usar ctrl-p e ctrl-n para rolar pelo histórico do bash (que é meu hábito), ele não será redesenhado. Se eu usar as setas do teclado, ele usa.

Você conseguiu encontrar uma maneira de contornar esse problema?

@Grazfather Acho que é um problema diferente. Acho que o problema é que a sequência de chaves para se separar de um contêiner é C-p C-q , então o docker vê seu C-p e está esperando C-q para se separar. Na verdade, não tentei, mas pode ser que usar --detach-keys= possa ajudar.

para quem vem aqui em busca de uma resposta, você pode encontrá-la aqui no stackoverflow

A resposta vinculada a aqui é a melhor solução imo porque outras soluções não funcionam quando você alterna os usuários dentro do contêiner, assumindo que você deseja o ambiente do novo usuário que sobrescreverá as variáveis ​​de ambiente LINES e COLUMNS.

Eu uso o xshell exec no docker ..

image

quando eu redimensiono a janela xshell ...
image

tamanho exec tty redefinido corretamente ... alguém sabe por quê, e como xshell faz isso ... Eu trabalhei em uma versão inferior do docker

image

Exemplo de composição do Docker para resolver este problema:

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

Foco no meio ambiente. @cromat obrigado!

@frops sua solução é inválida. a chave environment é usada para inicializar o ambiente na etapa de criação do contêiner, portanto, não é a solução correta. você precisa de valores de env definidos durante a entrada do contêiner, não de criação.

além disso, como li @thaJeztah disse que foi corrigido em 18.06

Definitivamente deve ser melhorado a partir do 18.06, mas ainda existem alguns casos em que o redimensionamento pode precisar ser reiniciado (você pode fazer isso redimensionando a janela do terminal); há uma solicitação de pull que adiciona um loop de repetição para esses casos, mas ainda não foi mesclado; https://github.com/docker/cli/pull/1529

Eu consideraria definir COLUMNS e LINES uma solução alternativa para algumas situações, mas não algo para manter em seu ambiente

Descobri que o bug ainda está presente se estiver executando com --tty e sem --interactive .
Docker versão 18.09.2, compilação 6247962

Exemplo para reproduzir:

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

Comando com saída quebrada / tamanho de terminal incorreto:
docker run --rm --tty slimage

https://github.com/docker/cli/pull/1529 ainda não está no `Docker 18.09

espera-se que seja corrigido em 19.03.0 (10 de julho de 2019)

Ele foi portado de volta para Docker CLI 18.09.5 por meio de https://github.com/docker/cli/pull/1775

ainda está presente no Mac OS mais recente ao compilar openwrt com o comando:
fazer menuconfig
e todas as soluções alternativas acima não funcionam para as janelas ncurses bagunçadas

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

Fiz para mim uma configuração VIM portátil com todos os meus plug-ins sofisticados para estilo e correção / correção. Até eu encontrar a solução

$ vi ~/.zshrc
function vim {
    docker run --env LINES=$(tput lines) --env COLUMNS=$(tput cols) # ... 
}
Esta página foi útil?
0 / 5 - 0 avaliações