देर से जवाब, लेकिन किसी की मदद कर सकते हैं
docker run/exec -iकंटेनर के अंदर कमांड के STDIN को docker run/execखुद के STDIN से जोड़ेगा ।
इसलिए
docker run -i alpine catआपको इनपुट के लिए एक खाली लाइन देता है। टाइप करें "हैलो" आपको एक प्रतिध्वनि "हैलो" मिलती है। कंटेनर तब तक बाहर नहीं निकलेगा जब तक आप CTRL + D नहीं भेजते हैं क्योंकि मुख्य प्रक्रिया catअनंत स्ट्रीम से इनपुट का इंतजार कर रही है, जिसका टर्मिनल इनपुट है docker run।
- दूसरी ओर
echo "hello" | docker -i run alpine cat"हैलो" प्रिंट करेगा और तुरंत बाहर निकल जाएगा क्योंकि catनोटिस कि इनपुट स्ट्रीम समाप्त हो गया है और खुद को समाप्त कर देता है।
यदि आप docker psउपरोक्त दोनों में से किसी एक से बाहर निकलने के बाद कोशिश करते हैं, तो आपको कोई भी चलने वाला कंटेनर नहीं मिलेगा। दोनों ही मामलों में, catखुद को समाप्त कर दिया है, इस प्रकार डॉकटर ने कंटेनर को समाप्त कर दिया है।
अब "-t" के लिए, यह डॉकटर के अंदर मुख्य प्रक्रिया को बताता है कि इसका इनपुट एक टर्मिनल डिवाइस है।
इसलिए
docker run -t alpine catआपको एक खाली रेखा देगा, लेकिन यदि आप "हैलो" टाइप करने का प्रयास करते हैं, तो आपको कोई प्रतिध्वनि नहीं मिलेगी। ऐसा इसलिए है क्योंकि जब catआप किसी टर्मिनल इनपुट से जुड़े होते हैं, तो यह इनपुट आपके इनपुट से जुड़ा नहीं होता है। आपके द्वारा टाइप किया गया "हैलो" इनपुट तक नहीं पहुंचा cat। catउस इनपुट की प्रतीक्षा कर रहा है जो कभी नहीं आता है।
echo "hello" | docker run -t alpine cat आपको एक खाली लाइन भी देगा और CTRL-D पर कंटेनर से बाहर नहीं निकलेगा, लेकिन आपको एक "हैलो" नहीं मिलेगा, क्योंकि आप पास नहीं हुए हैं -i
यदि आप CTRL + C भेजते हैं, तो आपको अपना शेल वापस मिल जाता है, लेकिन यदि आप docker psअभी कोशिश करते हैं, तो आप catकंटेनर को अभी भी देखते हैं । ऐसा इसलिए है क्योंकि catअभी भी एक इनपुट स्ट्रीम पर प्रतीक्षा की जा रही है जो कभी बंद नहीं हुई थी। मुझे -tअकेले संयुक्त किए बिना कोई उपयोगी उपयोग नहीं मिला -i।
अब, -itएक साथ के लिए। यह बिल्ली को बताता है कि उसका इनपुट एक टर्मिनल है और उसी समय में इस टर्मिनल को उस इनपुट से कनेक्ट करें, docker runजो एक टर्मिनल है। docker run/execयह सुनिश्चित कर लेगा कि इसका अपना इनपुट वास्तव में इसे पास करने से पहले एक tty है cat। यही कारण है कि input device is not a TTYयदि आप कोशिश करेंगे तो आपको मिलेगा echo "hello" | docker run -it alpine catक्योंकि इस मामले में, docker runस्वयं का इनपुट पिछली प्रतिध्वनि से पाइप है न कि टर्मिनल जहां docker runनिष्पादित होता है
अंत में, आपको पास करने की आवश्यकता क्यों होगी -tयदि -iआपके इनपुट को इनपुट से जोड़ने की ट्रिक आएगी cat? ऐसा इसलिए है क्योंकि अगर यह टर्मिनल है तो कमांड अलग तरीके से इनपुट का उपचार करते हैं। यह भी उदाहरण द्वारा सबसे अच्छा चित्रण किया गया है
docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -pआपको एक पासवर्ड प्रॉम्प्ट देगा। यदि आप पासवर्ड टाइप करते हैं, तो अक्षर स्पष्ट रूप से मुद्रित होते हैं।
docker run -i alpine shआपको एक खाली लाइन देगा। यदि आप एक कमांड टाइप करते हैं जैसे lsआपको आउटपुट मिलता है, लेकिन आपको प्रॉम्प्ट या रंगीन आउटपुट नहीं मिलेगा।
पिछले दो मामलों में, आपको यह व्यवहार मिलता है क्योंकि mysqlसाथ ही shellइनपुट को टिट्टी के रूप में नहीं मान रहे थे और इस प्रकार इनपुट को मास्क करने या आउटपुट को रंग देने जैसे छोटे विशिष्ट व्यवहार का उपयोग नहीं किया था।