Jawaban terlambat, tetapi mungkin membantu seseorang
docker run/exec -i
akan menghubungkan STDIN dari perintah di dalam wadah ke STDIN docker 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 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 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 saat cat
terhubung ke input terminal, input ini tidak terhubung ke input Anda. "Halo" yang Anda ketikkan tidak mencapai input cat
. 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 melihat cat
wadah masih berjalan. Ini karena cat
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 input docker run
yang merupakan terminal. docker run/exec
akan memastikan bahwa inputnya sendiri sebenarnya tty sebelum meneruskannya cat
. Inilah sebabnya mengapa Anda akan mendapatkan input device is not a TTY
jika Anda mencoba echo "hello" | docker run -it alpine cat
karena dalam kasus ini, input docker run
itu sendiri adalah pipa dari gema sebelumnya dan bukan terminal tempat docker run
dieksekusi
Akhirnya, mengapa Anda harus lulus -t
jika -i
akan melakukan trik menghubungkan input Anda ke cat
input? 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 -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 seperti ls
Anda mendapatkan output, tetapi Anda tidak akan mendapatkan output berwarna atau prompt.
Dalam dua kasus terakhir, Anda mendapatkan perilaku ini karena mysql
juga shell
tidak memperlakukan input sebagai tty dan karenanya tidak menggunakan perilaku spesifik tty seperti menutupi input atau mewarnai output.