Moby: Perilaku terminal aneh di dalam buruh pelabuhan

Dibuat pada 23 Jun 2017  ·  33Komentar  ·  Sumber: moby/moby

Ketika saya exec ke /bin/bash inside docker (docker exec -ti container /bin/bash) dan mencari perintah secara rekursif, terkadang terminal mulai berperilaku aneh dan semuanya kacau seperti pada gambar.
Setelah itu saya harus keluar dari wadah dan masuk lagi.
selection_017

Komentar yang paling membantu

Saya telah menemukan bahwa bug ini memang karena parameter lebar dan tinggi terminal yang terkadang tidak disediakan untuk wadah dengan perintah docker exec

Anda dapat membaca lebih lanjut tentang itu di edisi ini: #10341

Saya telah menyelesaikan bug dengan cara ini:

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

Anda juga dapat meletakkan perintah ini dalam skrip dan memberikan nama wadah sebagai parameter dan membuat alias seperti docker-exec

Semua 33 komentar

Ctrl-P/Ctrl-N berperilaku aneh dalam kasus saya dan itu menjengkelkan untuk menavigasi melalui riwayat Shell. Mungkin saja kita bermasalah dengan masalah yang sama.

Saya juga memperhatikan bahwa menavigasi melalui riwayat dengan tombol atas terkadang mereproduksi perilaku ini.

Saya sering mengalami masalah terminal yang tampaknya disebabkan oleh Docker yang tidak mengetahui ukuran terminal yang tepat pada awalnya. Ini tampaknya hanya terjadi pada terminal baru. (Ini mungkin atau mungkin bukan penyebab masalah Anda.) Misalnya:

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

Saya telah menemukan bahwa bug ini memang karena parameter lebar dan tinggi terminal yang terkadang tidak disediakan untuk wadah dengan perintah docker exec

Anda dapat membaca lebih lanjut tentang itu di edisi ini: #10341

Saya telah menyelesaikan bug dengan cara ini:

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

Anda juga dapat meletakkan perintah ini dalam skrip dan memberikan nama wadah sebagai parameter dan membuat alias seperti docker-exec

Terima kasih @cromat! Ini memecahkan masalah yang saya alami menggunakan Docker untuk Windows di Bash pada Windows di mana outputnya tidak cukup lebar karena tidak memiliki TTY yang tepat. Sepertinya backtick Anda diformat menjadi kode, jadi inilah barisnya lagi:

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

bagi siapa pun yang datang ke sini mencari jawaban, Anda dapat menemukannya di sini di stackoverflow

Terima kasih @PhilT.

Inilah yang berhasil untuk saya.

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

Terima kasih! Itu juga memecahkan masalah saya!

Setelah mencoba selusin solusi @PhilT adalah satu-satunya yang berhasil

Ini adalah pendekatan yang lebih tepat. Tidak perlu double-exec bash.

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

Solusi @eigood bekerja seperti pesona pada percobaan pertama ...

Saya menggunakan ubuntu dengan gnome. Biasanya saya mengubah ukuran jendela dan masalah teratasi sendiri.
Mengubah ukuran di gnome adalah Ctrl+Super+(Down Arrow) dan kemudian Ctrl+Super+(Up Arrow)

@eigood Terima kasih atas solusi yang benar. Mengapa Docker tidak melakukan ini saja?

@PhilT @cromat Dalam kasus saya, saya membutuhkan opsi -i seperti pada -it bukan hanya opsi -t .

Saya membuat alias untuk membuat hidup saya lebih mudah.

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

Misalnya.:

dexec containername_service_1 bash

@romulo1984 versi buruh pelabuhan apa yang Anda jalankan? ini harus diperbaiki di versi saat ini

@thaJeztah 17.12.0-ce

Versi itu mencapai EOL pada bulan Maret; Saya akan merekomendasikan memperbarui ke 18,06 (rilis stabil saat ini), yang memiliki perbaikan untuk ini

@thaJeztah terima kasih.

Saya dapat mengonfirmasi bahwa masalah ini telah diselesaikan dengan Docker 18.06.

@nodakai Saya memiliki masalah yang sama dengan Anda: Saya tidak memiliki masalah dengan lebar atau apa pun, tetapi Docker sesuatu tidak akan digambar ulang. Secara khusus, jika saya menggunakan ctrl-p dan ctrl-n untuk menelusuri riwayat bash (yang merupakan kebiasaan saya), itu tidak menggambar ulang. Jika saya menggunakan tombol panah, itu benar.

Apakah Anda berhasil menemukan cara untuk mengatasi masalah ini?

@Grazfather Saya pikir itu masalah yang berbeda. Saya pikir masalahnya adalah bahwa urutan kunci untuk melepaskan dari wadah adalah C-p C-q , jadi buruh pelabuhan melihat C-p dan menunggu C-q untuk melepaskan. Saya belum benar-benar mencoba, tetapi mungkin menggunakan --detach-keys= dapat membantu.

bagi siapa pun yang datang ke sini mencari jawaban, Anda dapat menemukannya di sini di stackoverflow

Jawaban yang ditautkan ke sini adalah solusi terbaik karena solusi lain tidak berfungsi ketika Anda mengganti pengguna di dalam wadah, dengan asumsi Anda menginginkan lingkungan pengguna baru yang akan menimpa variabel lingkungan LINES dan COLUMNS.

Saya menggunakan xshell exec di buruh pelabuhan ..

image

ketika saya mengubah ukuran jendela xshell ...
image

exec tty size reset dengan benar ... ada yang tahu mengapa ini, dan bagaimana xshell melakukannya ... Saya bekerja di versi buruh pelabuhan yang lebih rendah

image

Contoh penulisan Docker untuk menyelesaikan masalah ini:

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

Fokus pada lingkungan. @cromat terima kasih!

@frops solusi Anda tidak valid. kunci environment digunakan untuk menginisialisasi lingkungan pada langkah membuat wadah, jadi itu bukan solusi yang benar. anda perlu menetapkan nilai env selama wadah masuk, bukan membuat.

selain itu, saat saya membaca @thaJeztah mengatakan sudah diperbaiki pada 18.06

Pasti harus ditingkatkan di 18.06 dan lebih tinggi, tetapi masih ada beberapa kasus di mana pengubahan ukuran mungkin perlu dipicu kembali (Anda dapat melakukannya dengan mengubah ukuran jendela terminal Anda); ada permintaan tarik yang menambahkan pengulangan percobaan untuk kasus tersebut, tetapi belum digabungkan; https://github.com/docker/cli/pull/1529

Saya akan mempertimbangkan untuk menetapkan COLUMNS dan LINES sebagai solusi untuk beberapa situasi, tetapi bukan sesuatu untuk disimpan di lingkungan Anda

Saya menemukan bug masih ada jika dijalankan dengan --tty dan tanpa --interactive .
Docker versi 18.09.2, build 6247962

Contoh untuk mereproduksi:

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

Perintah dengan output rusak/ukuran terminal salah:
docker run --rm --tty slimage

https://github.com/docker/cli/pull/1529 belum ada di `Docker 18.09

diharapkan akan diperbaiki pada 19.03.0 (10 Juli 2019)

Itu kembali porting ke Docker CLI 18.09.5 melalui https://github.com/docker/cli/pull/1775

masih hadir di Mac OS terbaru saat mengkompilasi openwrt dengan perintah:
buat konfigurasi menu
dan semua solusi di atas tidak berfungsi untuk jendela ncurses yang kacau

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

Saya membuat sendiri konfigurasi VIM portabel dengan semua plugin mewah saya untuk gaya dan linting/perbaikan. Sampai saya menemukan solusi @cromat, saya selalu memiliki masalah tata letak dengan VIM + NERDTree. Sekarang bekerja dengan baik. Baru saja menjadikan diri saya alias (fungsi, saya suka fungsi tetapi hal yang sama di sini).

$ vi ~/.zshrc
function vim {
    docker run --env LINES=$(tput lines) --env COLUMNS=$(tput cols) # ... 
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat