ماذا "جهاز الإدخال ليس تي "يعني بالضبط في" عامل الميناء تشغيل " الإخراج?

هذا أمر يعمل:

$ echo 'hi there' | docker run -i ubuntu cathi there

هذا أمر يستجيب برسالة خطأ:

$ echo 'hi there' | docker run -it ubuntu catthe input device is not a TTY

وأود أن معرفة بالضبط ما يحدث هنا. ليس فقط "إزالة ر وأنها سوف تكون ثابتة".

وأنا أعلم أن docker runمن -t الخيار لتقف على "تخصيص الزائفة تي" ، ولقد قرأت نظرة عامة تاريخية على ما يمثله تي، لكنه لم يساعدني على فهم نوع العقد الذي يتم انتهاكه هنا.

إجابة متأخرة ، لكنها قد تساعد شخصا ما

docker run/exec -i سوف ربط ستدين من الأمر داخل الحاوية إلى ستدين من docker run/exec نفسها.

لذا

  • docker run -i alpine cat يمنحك خط فارغ في انتظار المدخلات. اكتب & مثل; مرحبا&مثل;تحصل على صدى &مثل; مرحبا&مثل;. لن تخرج الحاوية حتى ترسل كترل + د لأن العملية الرئيسية cat ينتظر الإدخال من الدفق اللانهائي الذي هو الإدخال الطرفي لـ docker run.
  • من ناحية أخرى echo "hello" | docker run -i alpine cat سوف طباعة & مثل; مرحبا & مثل; والخروج فورا ل cat يلاحظ أن دفق الإدخال قد انتهى وينهي نفسه.

إذا حاولت docker ps بعد الخروج من أي مما سبق ، لن تجد أي حاويات قيد التشغيل. في كلتا الحالتين, cat تم إنهاء نفسه ، وبالتالي قام عامل الميناء بإنهاء الحاوية.

الآن ل&مثل; - ر & مثل;, هذا يحكي العملية الرئيسية داخل عامل الميناء أن مدخلاته هو جهاز المحطة.

لذا

  • docker run -t alpine cat سوف اعطيكم خط فارغ, ولكن إذا حاولت كتابة &مثل;مرحبا&مثل;, أنك لن تحصل على أي صدى. هذا لأنه في حين cat متصل بإدخال محطة ، هذا الإدخال غير متصل بالإدخال الخاص بك. ال&مثل; مرحبا & مثل; التي كتبتها لم تصل إلى مدخلات cat. cat ينتظر المدخلات التي لا تصل أبدا.
  • echo "hello" | docker run -t alpine cat سوف تعطيك أيضا خط فارغ ولن الخروج من الحاوية على السيطرة - د ولكنك لن تحصل على صدى & مثل; مرحبا & مثل; لأنك لم تمر -i

إذا قمت بإرسال السيطرة + ج ، يمكنك الحصول على قذيفة الخاص بك مرة أخرى، ولكن إذا حاولت 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 -uroot -p سوف تعطيك موجه كلمة المرور. إذا قمت بكتابة كلمة المرور ، تتم طباعة الأحرف بشكل واضح.
  • docker run -i alpine sh سوف تعطيك خط فارغ. إذا قمت بكتابة أمر مثل ls تحصل على إخراج ، لكنك لن تحصل على إخراج موجه أو ملون.

في الحالتين الأخيرتين ، تحصل على هذا السلوك لأن mysql وكذلك shell لم يتم التعامل مع المدخلات كما تي وبالتالي لم تستخدم سلوك معين تي مثل إخفاء المدخلات أو تلوين الإخراج.

هذه الإجابة ساعدني على التفاف رأسي حول:

  • بشكل افتراضي (بدون أي منهما -i ولا -t خيارات) حاوية عامل الميناء يرسل فقط مخرجاتها توستدوت,
  • مع -i الخيار يأتي اتصال ستدين,
  • -t يسحب الخيار في برنامج تشغيل واجهة المحطة الطرفية، الذي يعمل على رأس ستدين / ستدوت. وعندما يتم سحب سائق المحطة الطرفية ، يجب أن يتوافق الاتصال مع الحاوية مع بروتوكول واجهة المحطة الطرفية. الأنابيب سلسلة لا.

و تي يشير لديك محطة ، وهو الأمر الذي سيتم توفيره من قبل شتيرم أو واحدة من العديد من واجهات سطر الأوامر لينكس. انها تحتاج الى لوحة المفاتيح واجهة إخراج النص المرتبطة به. الأسباب النموذجية لرغبة هذا هو لدعم إخراج النص اللون ، والتعامل مع مجموعات المفاتيح المختلفة (مثل مفاتيح الأسهم) ، والقدرة على تحريك المؤشر حول الشاشة.

عند الأنابيب أمر في عامل الميناء مثل الخاص بك echo يظهر المثال ، أن الأنابيب هو المدخلات ، وأن الأنابيب ليس لديها واجهة تي، انها مجرد تيار من النص. محاولة إنشاء تي مع ذلك سوف تفشل كما تشير رسالة الخطأ.

هل يمكنني البدء في عامل الميناء? لدي بعض التطبيقات التي تتوقف عن العمل وأنا لا تشغيل عامل الميناء مع ‘- ر’ ، ولكن لا أستطيع تعديل الأمر بدء عامل الميناء في الإنتاج. لذلك أنا بحاجة لجعل التطبيق أعتقد أنه بدأ مع ‘- ر’.

انها ليست زائدة عن الحاجة ، عامل الميناء يمكن إنشاء تي دون إرفاق أي شيء لذلك. سيكون للإخراج الخاص بك أحرف للون ، وما إلى ذلك ، ولكن لن يتم توصيل مخرجات المحطة الطرفية في إدخال الحاوية. لذلك سيتم وضع الأحرف التي تكتبها في قائمة الانتظار للأمر التالي الذي تقوم بتشغيله بعد خروج أمر عامل الإرساء.