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 catmemberi Anda baris kosong menunggu masukan. Ketik "halo" Anda mendapatkan gema "halo". Penampung tidak akan keluar sampai Anda mengirim CTRL+D karena proses utamacatsedang menunggu input dari aliran tak terbatas yang merupakan input terminal daridocker run.- Di sisi lain
echo "hello" | docker -i run alpine catakan mencetak "halo" dan segera keluar karenacatpemberitahuan 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 catakan memberi Anda baris kosong, tetapi jika Anda mencoba mengetik "halo", Anda tidak akan mendapatkan gaung apa pun. Ini karena whilecatterhubung ke input terminal, input ini tidak terhubung ke input Anda. Kata "halo" yang Anda ketikkan tidak mencapai inputcat.catsedang menunggu input yang tak kunjung tiba.echo "hello" | docker run -t alpine catjuga 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 -pakan memberi Anda prompt kata sandi. Jika Anda mengetik sandi, karakter akan tercetak dengan jelas.docker run -i alpine shakan memberi Anda baris kosong. Jika Anda mengetik perintah sepertilsAnda 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
-imaupun-topsi) wadah Docker hanya mengirimkan hasilnya ke STDOUT, - dengan
-ipilihan datang koneksi ke STDIN, -topsi 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.