GNU/Linux >> Belajar Linux >  >> Linux

Apa arti sebenarnya perangkat input bukan TTY dalam keluaran docker run?

Solusi 1:

Jawaban terlambat, tetapi mungkin membantu seseorang

docker run/exec -i akan menghubungkan STDIN dari perintah di dalam wadah ke STDIN dari docker run/exec diri.

Jadi

  • docker run -i alpine cat memberi Anda baris kosong menunggu masukan. Ketik "halo" Anda mendapatkan gema "halo". Penampung tidak akan keluar sampai Anda mengirim CTRL+D karena proses utama cat sedang menunggu input dari aliran tak terbatas yang merupakan input terminal dari docker run .
  • Di sisi lain echo "hello" | docker -i run alpine cat akan mencetak "halo" dan segera keluar karena cat pemberitahuan bahwa aliran input telah berakhir dan berhenti sendiri.

Jika Anda mencoba docker ps setelah Anda keluar dari salah satu cara di atas, Anda tidak akan menemukan wadah yang sedang berjalan. Dalam kedua kasus, cat itu sendiri telah dihentikan, sehingga buruh pelabuhan telah menghentikan wadah.

Sekarang untuk "-t", ini memberi tahu proses utama di dalam buruh pelabuhan bahwa inputnya adalah perangkat terminal.

Jadi

  • docker run -t alpine cat akan memberi Anda baris kosong, tetapi jika Anda mencoba mengetik "halo", Anda tidak akan mendapatkan gaung apa pun. Ini karena while cat terhubung ke input terminal, input ini tidak terhubung ke input Anda. Kata "halo" yang Anda ketikkan tidak mencapai input cat . cat sedang menunggu input yang tak kunjung tiba.
  • echo "hello" | docker run -t alpine cat juga akan memberi Anda baris kosong dan tidak akan keluar dari wadah di CTRL-D tetapi Anda tidak akan mendapatkan gema "halo" karena Anda tidak lulus -i

Jika Anda mengirim CTRL+C, Anda mendapatkan shell Anda kembali, tetapi jika Anda mencoba docker ps sekarang, Anda melihat cat wadah masih berjalan. Ini karena cat masih menunggu input stream yang tidak pernah ditutup. Saya belum menemukan penggunaan yang berguna untuk -t sendiri tanpa digabungkan dengan -i .

Sekarang, untuk -it bersama. Ini memberi tahu kucing bahwa inputnya adalah terminal dan pada saat yang sama menghubungkan terminal ini ke input docker run yang merupakan terminal. docker run/exec akan memastikan bahwa inputnya sendiri sebenarnya adalah tty sebelum meneruskannya ke cat . Inilah mengapa Anda akan mendapatkan input device is not a TTY jika Anda mencoba echo "hello" | docker run -it alpine cat karena dalam hal ini, masukan docker run itu sendiri adalah pipa dari gema sebelumnya dan bukan terminal tempat docker run dieksekusi

Terakhir, mengapa Anda harus meneruskan -t jika -i akan melakukan trik menghubungkan input Anda ke cat masukan? Ini karena perintah memperlakukan input secara berbeda jika itu adalah terminal. Ini juga paling baik diilustrasikan dengan contoh

  • docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -p akan memberi Anda prompt kata sandi. Jika Anda mengetik sandi, karakter akan tercetak dengan jelas.
  • docker run -i alpine sh akan memberi Anda baris kosong. Jika Anda mengetik perintah seperti ls Anda mendapatkan keluaran, tetapi Anda tidak akan mendapatkan keluaran yang cepat atau berwarna.

Dalam dua kasus terakhir, Anda mendapatkan perilaku ini karena mysql serta shell tidak memperlakukan input sebagai tty dan dengan demikian tidak menggunakan perilaku khusus tty seperti menutupi input atau mewarnai output.

Solusi 2:

Jawaban ini membantu saya memahami:

  • secara default (tanpa -i maupun -t opsi) wadah Docker hanya mengirimkan hasilnya ke STDOUT,
  • dengan -i pilihan datang koneksi ke STDIN,
  • -t opsi menarik driver antarmuka terminal , yang berfungsi di atas STDIN/STDOUT. Dan ketika driver terminal ditarik, komunikasi dengan kontainer harus sesuai dengan protokol antarmuka terminal. Menyalurkan string tidak.

Solusi 3:

Sebuah tty menunjukkan Anda memiliki terminal, sesuatu yang akan disediakan oleh xterm atau salah satu dari banyak antarmuka baris perintah linux. Perlu keyboard dan antarmuka keluaran teks yang terkait dengannya. Alasan umum menginginkan ini adalah untuk dukungan output teks berwarna, penanganan berbagai kombinasi tombol (seperti tombol panah), dan kemampuan untuk memindahkan kursor di sekitar layar.

Saat Anda menyalurkan perintah ke buruh pelabuhan seperti echo Anda contoh menunjukkan, pipa itu adalah input, dan pipa itu tidak memiliki antarmuka tty, itu hanya aliran teks. Mencoba membuat tty dengan itu akan gagal seperti yang ditunjukkan pesan kesalahan.


Linux
  1. Apa Arti Ukuran Direktori Dalam Output Perintah 'ls -l'?

  2. Apa Arti Ampersand Di Akhir Baris Skrip Shell?

  3. Apa Arti Atribut 's' Dalam Izin File ??

  1. Apa arti rc dalam file dot

  2. Docker bash prompt tidak menampilkan keluaran warna

  3. VIMRC, SCREENRC, BASHRC, KSHRC, dll. Apa yang dimaksud dengan RC?

  1. Apa arti 'rc' di `.bashrc`, dll.?

  2. Apa arti pipa linux | melakukan?

  3. iptables:apa sebenarnya arti --src-type LOCAL?