Geç cevap, ama birine yardımcı olabilir
docker run/exec -i
kap içindeki komutun STDIN'ini kendi STDIN'ine bağlayacaktır docker run/exec
.
Yani
docker run -i alpine cat
giriş için bekleyen boş bir satır verir. "Merhaba" yazın, yankı "merhaba" elde edersiniz. Ana işlem cat
, uçbirim terminali olan sonsuz akıştan girdi beklediğinden , CTRL + D gönderilinceye kadar kap çıkmaz docker run
.
- Öte yandan
echo "hello" | docker -i run alpine cat
, "merhaba" yazdıracak cat
ve giriş akışının sona erdiğini ve kendini sonlandırdığını bildirdiği için hemen çıkacaktır .
docker ps
Yukarıdakilerden herhangi birinden çıktıktan sonra denerseniz , çalışan kap bulamazsınız. Her iki durumda da, cat
kendisi sonlandırıldı, böylece liman işçisi konteyneri sonlandırdı.
Şimdi "-t" için, docker içindeki ana işleme girişinin bir terminal cihazı olduğunu söyler.
Yani
docker run -t alpine cat
size boş bir satır verecektir, ancak "merhaba" yazmaya çalışırsanız yankı almayacaksınız. Bunun nedeni, cat
bir terminal girişine bağlıyken, bu girişin girişinize bağlı olmamasıdır. Yazdığınız "merhaba" girdisine ulaşmadı cat
. cat
hiç gelmeyen girdileri bekliyor.
echo "hello" | docker run -t alpine cat
size boş bir satır verecek ve CTRL-D'deki kapsayıcıdan çıkmayacak, ancak geçemediğiniz için yankı "merhaba" alamayacaksınız -i
CTRL + C gönderirseniz kabuğunuzu geri alırsınız, ancak docker ps
şimdi denerseniz , cat
kabın hala çalıştığını görürsünüz . Çünkü cat
hala kapatılmamış bir girdi akışında beklemektedir. -t
Birleştirilmeden yalnız başına herhangi bir yararlı kullanım bulamadım -i
.
Şimdi -it
birlikte. Bu, kedinin girişinin bir terminal olduğunu söyler ve aynı zamanda bu terminali girişi docker run
bir terminal olan bir terminale bağlar . docker run/exec
kendi girdisinin aslında onu geçmeden önce bir tty olduğundan emin olacaktır cat
. Bu nedenle, input device is not a TTY
eğer denerseniz bir alırsınız, echo "hello" | docker run -it alpine cat
çünkü bu durumda, docker run
kendisinin girişi önceki yürütme noktasından gelen borudır docker run
, çalıştırılan terminal değil
Son olarak, neden geçmek gerekir -t
eğer -i
sizin girişi bağlama hile olacaktır cat
bireyin girdi? Bunun nedeni komutların girdiye bir terminal olması durumunda farklı davranmasıdır. Bu aynı zamanda en iyi örnekle gösterilmiştir
docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -p
size bir şifre istemi verecektir. Parolayı yazarsanız, karakterler görünür şekilde yazdırılır.
docker run -i alpine sh
size boş bir satır verecektir. ls
Çıktı aldığınız gibi bir komut yazarsanız, ancak komut istemi veya renkli çıktı almazsınız.
Son iki durumda, çünkü bu davranışı elde mysql
sıra sıra shell
girişi maskeleme veya çıkışı boyama gibi tty belirli bir davranışı kullanmak vermedi böylece uçbirimlerden olarak girdi tedavi değildi ve.