Moby: Странное поведение терминала внутри докера

Созданный на 23 июн. 2017  ·  33Комментарии  ·  Источник: moby/moby

Когда я выполняю команду / bin / bash внутри докера (docker exec -ti container / bin / bash) и выполняю рекурсивный поиск команды, иногда терминал начинает вести себя странно и все портится, как на картинке.
После этого мне нужно выйти из контейнера и снова запустить его.
selection_017

Самый полезный комментарий

Я обнаружил, что эта ошибка действительно связана с параметрами ширины и высоты терминала, которые иногда не предоставляются контейнеру с помощью команды docker exec.

Подробнее об этом читайте в этом выпуске: # 10341.

Я решил ошибку следующим образом:

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

Вы также можете поместить эту команду в сценарий и указать имя контейнера в качестве параметра и создать псевдоним, например docker-exec

Все 33 Комментарий

Ctrl-P / Ctrl-N в моем случае ведут себя странно, и навигация по истории оболочки раздражает. Возможно, нас беспокоит одна и та же проблема.

Я также заметил, что навигация по истории с помощью клавиши «вверх» иногда воспроизводит это поведение.

У меня часто возникают проблемы с терминалом, которые, кажется, сводятся к тому, что Docker не понимает, каков правильный размер терминала изначально. Такое вроде бы происходит только на свежем терминале. (Это может быть, а может и не быть причиной вашей проблемы.) Например:

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

Я обнаружил, что эта ошибка действительно связана с параметрами ширины и высоты терминала, которые иногда не предоставляются контейнеру с помощью команды docker exec.

Подробнее об этом читайте в этом выпуске: # 10341.

Я решил ошибку следующим образом:

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

Вы также можете поместить эту команду в сценарий и указать имя контейнера в качестве параметра и создать псевдоним, например docker-exec

Спасибо @cromat! Это решило проблему, с которой я столкнулся с использованием Docker для Windows в Bash в Windows, когда вывод был недостаточно широким из-за отсутствия надлежащего TTY. Похоже, ваши обратные кавычки отформатированы в код, так что вот строка снова:

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

для всех, кто приходит сюда в поисках ответа, вы можете найти его здесь, в stackoverflow

Спасибо @PhilT.

Это то, что у меня сработало.

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

Спасибо! Это тоже решило мою проблему!

Попробовав дюжину решений, @PhilT оказался единственным, что сработало.

Это более правильный подход. Нет необходимости в двойном запуске bash.

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

Решение @eigood сработало как шарм с первой попытки ...

Я использую ubuntu с gnome. Обычно я меняю размер окна, и проблема решается сама собой.
Изменение размера в gnome: Ctrl+Super+(Down Arrow) а затем Ctrl+Super+(Up Arrow)

@eigood Спасибо за правильное решение. Почему Докер просто этого не сделает?

@PhilT @cromat В моем случае мне нужна опция -i как в -it а не только опция -t .

Я создал псевдоним, чтобы облегчить себе жизнь.

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

Например.:

dexec containername_service_1 bash

@ romulo1984 какая у вас версия докера? это должно быть исправлено в текущей версии

@thaJeztah 17.12.0-ce

Эта версия достигла EOL в марте; Я бы рекомендовал обновиться до 18.06 (текущий стабильный выпуск), в котором есть исправление для этого

@thaJeztah, спасибо.

Я могу подтвердить, что эта проблема решена с помощью Docker 18.06.

@nodakai У меня такая же проблема, как и у вас: у меня нет проблем с шириной или чем-то еще, но Docker что-то не перерисовывает. В частности, если я использую ctrl-p и ctrl-n для прокрутки истории bash (что является моей привычкой), она не перерисовывается. Если я использую клавиши со стрелками, да.

Удалось ли вам обойти эту проблему?

@Grazfather Я думаю, что это другая проблема. Я думаю, проблема в том, что последовательность клавиш для отсоединения от контейнера - C-p C-q , поэтому докер видит ваш C-p и ждет C-q , чтобы отсоединиться. На самом деле я не пробовал, но может оказаться, что использование --detach-keys= может помочь.

для всех, кто приходит сюда в поисках ответа, вы можете найти его здесь, в stackoverflow

Ответ, связанный с этим, является лучшим решением imo, потому что другие решения не работают, когда вы переключаете пользователей внутри контейнера, предполагая, что вам нужна среда нового пользователя, которая перезапишет переменные среды LINES и COLUMNS.

Я использую xshell exec в докере ..

image

когда я изменяю размер окна xshell ...
image

exec tty size reset правильно ... кто-нибудь знает, почему и как это делает xshell ... Я работал с более низкой версией докера

image

Пример Docker-compose для решения этой проблемы:

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

Сосредоточьтесь на окружающей среде. @cromat спасибо!

@frops ваше решение недействительно. ключ environment используется для инициализации среды на этапе создания контейнера, поэтому это неправильное решение. вам нужны значения env, установленные при входе в контейнер, а не при создании.

кроме того, когда я читал, @thaJeztah сказал, что он исправлен в 18.06.

Определенно следует улучшить в 18.06 и более поздних версиях, но все же в некоторых случаях может потребоваться повторное изменение размера (вы можете сделать это, изменив размер окна терминала); есть запрос на вытягивание, который добавляет цикл повтора для этих случаев, но он еще не объединен; https://github.com/docker/cli/pull/1529

Я бы подумал о том, чтобы установить COLUMNS и LINES как обходной путь для некоторых ситуаций, но не то, что нужно держать в своей среде.

Я обнаружил, что ошибка все еще присутствует при работе с --tty и без --interactive .
Докер версии 18.09.2, сборка 6247962

Пример воспроизведения:

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

Команда с неработающим выводом / неправильным размером терминала:
docker run --rm --tty slimage

https://github.com/docker/cli/pull/1529 еще не в `Docker 18.09

ожидается, будет исправлено в 19.03.0 (10 июля 2019 г.)

Он был обратно перенесен на Docker CLI 18.09.5 через https://github.com/docker/cli/pull/1775

все еще присутствует в последней версии Mac OS при компиляции openwrt с помощью команды:
сделать menuconfig
и все вышеперечисленные обходные пути не работают для испорченных окон ncurses

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

Я сделал себе портативную конфигурацию VIM со всеми моими причудливыми плагинами для стиля и линтинга / исправления. Пока я не придумал решение @cromat, у меня всегда были проблемы с макетом с VIM + NERDTree. Теперь все работает хорошо. Просто сделал себе псевдоним (функция, мне нравятся функции, но здесь то же самое).

$ vi ~/.zshrc
function vim {
    docker run --env LINES=$(tput lines) --env COLUMNS=$(tput cols) # ... 
}
Была ли эта страница полезной?
0 / 5 - 0 рейтинги