देर से जवाब, लेकिन किसी की मदद कर सकते हैं
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
इनपुट को टिट्टी के रूप में नहीं मान रहे थे और इस प्रकार इनपुट को मास्क करने या आउटपुट को रंग देने जैसे छोटे विशिष्ट व्यवहार का उपयोग नहीं किया था।