Ini adalah perintah yang berfungsi:
$ echo 'hi there' | docker run -i ubuntu cat
hi there
Ini adalah perintah yang merespons dengan pesan kesalahan:
$ echo 'hi there' | docker run -it ubuntu cat
the input device is not a TTY
Saya ingin mencari tahu apa yang terjadi di sini. Bukan hanya "hapus -t dan itu akan diperbaiki".
Aku tahu bahwa docker run
's -t
pilihan singkatan dari 'Mengalokasikan pseudo-TTY', dan saya telah membaca ikhtisar sejarah apa TTY singkatan , tapi itu tidak membantu saya memahami jenis kontrak dilanggar di sini.
-t
, tetapi saya tidak dapat memodifikasi perintah mulai buruh pelabuhan dalam produksi. Jadi saya perlu membuat aplikasi berpikir itu dimulai dengan-t
.Jawaban:
Jawaban ini membantu saya merangkul:
-i
atau-t
opsi) wadah Docker hanya mengirimkan hasilnya ke STDOUT,-i
opsi datang koneksi ke STDIN,-t
opsi menarik driver antarmuka terminal , yang bekerja di atas STDIN / STDOUT. Dan ketika driver terminal ditarik, komunikasi dengan kontainer harus sesuai dengan protokol antarmuka terminal . Perpipaan string tidak.sumber
Jawaban terlambat, tetapi mungkin membantu seseorang
docker run/exec -i
akan menghubungkan STDIN dari perintah di dalam wadah ke STDINdocker run/exec
itu sendiri.Begitu
docker run -i alpine cat
memberi Anda garis kosong menunggu input. Ketik "halo" Anda mendapatkan gema "halo". Kontainer tidak akan keluar sampai Anda mengirim CTRL + D karena proses utamacat
sedang menunggu input dari aliran tak terbatas yang merupakan input terminal daridocker run
.echo "hello" | docker -i run alpine cat
akan mencetak "halo" dan segera keluar karenacat
pemberitahuan bahwa aliran input telah berakhir dan berakhir dengan sendirinya.Jika Anda mencoba
docker ps
setelah Anda keluar dari salah satu di atas, Anda tidak akan menemukan wadah berjalan. Dalam kedua kasus,cat
itu sendiri telah berakhir, sehingga buruh pelabuhan telah mengakhiri wadah.Sekarang untuk "-t", ini memberitahu proses utama di dalam docker bahwa inputnya adalah perangkat terminal.
Begitu
docker run -t alpine cat
akan memberi Anda baris kosong, tetapi jika Anda mencoba mengetik "halo", Anda tidak akan mendapatkan gema. Ini karena saatcat
terhubung ke input terminal, input ini tidak terhubung ke input Anda. "Halo" yang Anda ketikkan tidak mencapai inputcat
.cat
sedang menunggu input yang tidak pernah tiba.echo "hello" | docker run -t alpine cat
juga akan memberi Anda garis 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 coba
docker ps
sekarang, Anda melihatcat
wadah masih berjalan. Ini karenacat
masih menunggu aliran input yang tidak pernah ditutup. Saya belum menemukan penggunaan yang berguna untuk-t
sendirian tanpa digabungkan dengan-i
.Sekarang, untuk
-it
bersama. Ini memberitahu kucing bahwa inputnya adalah terminal dan pada saat yang sama sambungkan terminal ini ke inputdocker run
yang merupakan terminal.docker run/exec
akan memastikan bahwa inputnya sendiri sebenarnya tty sebelum meneruskannyacat
. Inilah sebabnya mengapa Anda akan mendapatkaninput device is not a TTY
jika Anda mencobaecho "hello" | docker run -it alpine cat
karena dalam kasus ini, inputdocker run
itu sendiri adalah pipa dari gema sebelumnya dan bukan terminal tempatdocker run
dieksekusiAkhirnya, mengapa Anda harus lulus
-t
jika-i
akan melakukan trik menghubungkan input Anda kecat
input? Ini karena perintah memperlakukan input secara berbeda jika terminal. Ini juga digambarkan dengan contohdocker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -p
akan memberi Anda kata sandi. Jika Anda mengetikkan kata sandi, karakter dicetak dengan jelas.docker run -i alpine sh
akan memberi Anda garis kosong. Jika Anda mengetik perintah sepertils
Anda mendapatkan output, tetapi Anda tidak akan mendapatkan output berwarna atau prompt.Dalam dua kasus terakhir, Anda mendapatkan perilaku ini karena
mysql
jugashell
tidak memperlakukan input sebagai tty dan karenanya tidak menggunakan perilaku spesifik tty seperti menutupi input atau mewarnai output.sumber
Sebuah tty menunjukkan Anda memiliki terminal, sesuatu yang akan disediakan oleh xterm atau salah satu dari banyak antarmuka baris perintah linux. Perlu antarmuka keyboard dan output teks yang terkait dengannya. Alasan umum untuk menginginkan ini adalah untuk dukungan output teks berwarna, penanganan berbagai kombinasi tombol (seperti tombol panah), dan kemampuan untuk memindahkan kursor di sekitar layar.
Ketika Anda memipakan perintah ke buruh pelabuhan seperti
echo
contoh Anda menunjukkan, bahwa pipa 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.sumber