देर से जवाब, लेकिन किसी की मदद कर सकते हैं
docker run/exec -iकंटेनर के अंदर कमांड के STDIN को docker run/execखुद के STDIN से जोड़ेगा ।
इसलिए
docker run -i alpine catआपको इनपुट के इंतजार में एक खाली लाइन देता है। टाइप करें "हैलो" आपको एक गूंज "हैलो" मिलती है। जब तक आप भेजते हैं तब तक कंटेनर बाहर नहीं निकलेगा CTRL+ Dक्योंकि मुख्य प्रक्रिया catअनंत स्ट्रीम से इनपुट का इंतजार कर रही है जो कि टर्मिनल इनपुट है docker run।
- दूसरी ओर
echo "hello" | docker run -i 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यह सुनिश्चित करेगा कि इसका अपना इनपुट वास्तव में इसे पास करने से पहले एक ट्टी है 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 -u root -pआपको एक पासवर्ड प्रॉम्प्ट देगा। यदि आप पासवर्ड टाइप करते हैं, तो वर्ण स्पष्ट रूप से मुद्रित होते हैं।
docker run -i alpine shआपको एक खाली लाइन देगा। यदि आप एक कमांड टाइप करते हैं जैसे कि lsआपको आउटपुट मिलता है, लेकिन आपको प्रॉम्प्ट या रंगीन आउटपुट नहीं मिलेगा।
पिछले दो मामलों में, आपको यह व्यवहार मिलता है क्योंकि mysqlसाथ ही shellइनपुट को टिट्टी के रूप में नहीं मान रहे थे और इस प्रकार इनपुट को मास्क करने या आउटपुट को रंगने जैसे विशिष्ट व्यवहार का उपयोग नहीं किया था।
-itझंडे के मौलिक व्यवहार की व्याख्या करता है ।