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 utamacat
sedang menunggu input dari aliran tak terbatas yang merupakan input terminal daridocker run
.- Di sisi lain
echo "hello" | docker -i run alpine cat
akan mencetak "halo" dan segera keluar karenacat
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 whilecat
terhubung ke input terminal, input ini tidak terhubung ke input Anda. Kata "halo" yang Anda ketikkan tidak mencapai inputcat
.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 sepertils
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.