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. Gönderdiğiniz kadar konteyner çıkmayacaktır CTRL+ Dana süreç nedeniyle cat
terminal girdidir sonsuz akışından girişi bekliyor docker run
.
- Öte yandan
echo "hello" | docker run -i 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 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 cat
konteyner hala çalışıyor. Çü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 -u root -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.
-it
bayrakların temel davranışlarını açıklıyor .