देर से जवाब, लेकिन किसी की मदद कर सकते हैं
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
झंडे के मौलिक व्यवहार की व्याख्या करता है ।