Jawaban terlambat, tetapi mungkin membantu seseorang
docker run/exec -iakan menghubungkan STDIN dari perintah di dalam wadah ke STDIN docker run/execitu sendiri.
Begitu
docker run -i alpine catmemberi Anda garis kosong menunggu input. Ketik "halo" Anda mendapatkan gema "halo". Kontainer tidak akan keluar sampai Anda mengirim CTRL + D karena proses utama catsedang menunggu input dari aliran tak terbatas yang merupakan input terminal dari docker run.
- Di sisi lain
echo "hello" | docker -i run alpine catakan mencetak "halo" dan segera keluar karena catpemberitahuan bahwa aliran input telah berakhir dan berakhir dengan sendirinya.
Jika Anda mencoba docker pssetelah Anda keluar dari salah satu di atas, Anda tidak akan menemukan wadah berjalan. Dalam kedua kasus, catitu 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 catakan memberi Anda baris kosong, tetapi jika Anda mencoba mengetik "halo", Anda tidak akan mendapatkan gema. Ini karena saat catterhubung ke input terminal, input ini tidak terhubung ke input Anda. "Halo" yang Anda ketikkan tidak mencapai input cat. catsedang 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 pssekarang, Anda melihat catwadah masih berjalan. Ini karena catmasih menunggu aliran input yang tidak pernah ditutup. Saya belum menemukan penggunaan yang berguna untuk -tsendirian tanpa digabungkan dengan -i.
Sekarang, untuk -itbersama. Ini memberitahu kucing bahwa inputnya adalah terminal dan pada saat yang sama sambungkan terminal ini ke input docker runyang merupakan terminal. docker run/execakan memastikan bahwa inputnya sendiri sebenarnya tty sebelum meneruskannya cat. Inilah sebabnya mengapa Anda akan mendapatkan input device is not a TTYjika Anda mencoba echo "hello" | docker run -it alpine catkarena dalam kasus ini, input docker runitu sendiri adalah pipa dari gema sebelumnya dan bukan terminal tempat docker rundieksekusi
Akhirnya, mengapa Anda harus lulus -tjika -iakan melakukan trik menghubungkan input Anda ke catinput? Ini karena perintah memperlakukan input secara berbeda jika terminal. Ini juga digambarkan dengan contoh
docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -pakan memberi Anda kata sandi. Jika Anda mengetikkan kata sandi, karakter dicetak dengan jelas.
docker run -i alpine shakan memberi Anda garis kosong. Jika Anda mengetik perintah seperti lsAnda mendapatkan output, tetapi Anda tidak akan mendapatkan output berwarna atau prompt.
Dalam dua kasus terakhir, Anda mendapatkan perilaku ini karena mysqljuga shelltidak memperlakukan input sebagai tty dan karenanya tidak menggunakan perilaku spesifik tty seperti menutupi input atau mewarnai output.