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.
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 ..
quando eu redimensiono a janela xshell ...
tamanho exec tty redefinido corretamente ... alguém sabe por quê, e como xshell faz isso ... Eu trabalhei em uma versão inferior do docker
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) # ...
}
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:
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