Geç cevap, ama birine yardımcı olabilir
docker run/exec -ikap içindeki komutun STDIN'ini kendi STDIN'ine bağlayacaktır docker run/exec.
Yani
docker run -i alpine catgiriş için bekleyen boş bir satır verir. "Merhaba" yazın, yankı "merhaba" elde edersiniz. Gönderdiğiniz kadar konteyner çıkmayacaktır CTRL+ Dana süreç nedeniyle catterminal girdidir sonsuz akışından girişi bekliyor docker run.
- Öte yandan
echo "hello" | docker run -i alpine cat, "merhaba" yazdıracak catve giriş akışının sona erdiğini ve kendini sonlandırdığını bildirdiği için hemen çıkacaktır .
docker psYukarıdakilerden herhangi birinden çıktıktan sonra denerseniz , çalışan kap bulamazsınız. Her iki durumda da, catkendisi 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 catsize boş bir satır verecektir, ancak "merhaba" yazmaya çalışırsanız yankı almayacaksınız. Bunun nedeni, catbir terminal girişine bağlıyken, bu girişin girişinize bağlı olmamasıdır. Yazdığınız "merhaba" girdisine ulaşmadı cat. cathiç gelmeyen girdileri bekliyor.
echo "hello" | docker run -t alpine catsize boş bir satır verecek ve kaptan çıkmayacak CTRL- Dama yankı "merhaba" almayacaksınız çünkü geçmediniz-i
Eğer gönderirseniz CTRL+ C, size kabuk geri almak, ama eğer deneyin docker psşimdi, gördüğünüz catkonteyner hala çalışıyor. Çünkü cathala kapatılmamış bir girdi akışında beklemektedir. -tBirleştirilmeden yalnız başına herhangi bir yararlı kullanım bulamadım -i.
Şimdi -itbirlikte. Bu, kedinin girişinin bir terminal olduğunu söyler ve aynı zamanda bu terminali girişi docker runbir terminal olan bir terminale bağlar . docker run/execkendi girdisinin aslında onu geçmeden önce bir tty olduğundan emin olacaktır cat. Bu nedenle, input device is not a TTYeğer denerseniz bir alırsınız, echo "hello" | docker run -it alpine catçünkü bu durumda, docker runkendisinin 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 -teğer -isizin girişi bağlama hile olacaktır catbireyin 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 -u root -psize bir şifre istemi verecektir. Parolayı yazarsanız, karakterler görünür şekilde yazdırılır.
docker run -i alpine shsize 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 mysqlsıra sıra shellgirişi maskeleme veya çıkışı boyama gibi tty belirli bir davranışı kullanmak vermedi böylece uçbirimlerden olarak girdi tedavi değildi ve.
-itbayrakların temel davranışlarını açıklıyor .