"ইনপুট ডিভাইসটি টিটিওয়াই নয়" এর সঠিক অর্থ "ডকার রান" আউটপুটটিতে কী বোঝায়?


18

এটি একটি আদেশ যা কাজ করে:

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

এটি একটি আদেশ যা একটি ত্রুটি বার্তার সাথে প্রতিক্রিয়া জানায়:

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

এখানে ঠিক কী ঘটে তা আমি বের করতে চাই। শুধু "অপসারণ-টি নয় এবং এটি ঠিক হয়ে যাবে"।

আমি জানি যে docker runএর -tবিকল্পটি "সিডো-টিটিওয়াই বরাদ্দ করুন" এর জন্য দাঁড়িয়েছে এবং টিটিওয়াই কী বোঝায় তার overতিহাসিক ওভারভিউগুলি পড়েছি , তবে এখানে কী ধরনের চুক্তি লঙ্ঘন করা হয়েছে তা বুঝতে আমার সহায়তা হয়নি।


এটি অনর্থক নয়, ডকার এতে কিছু সংযুক্ত না করেই টিটিওয়াই তৈরি করতে পারে। আপনার আউটপুটটিতে বর্ণ ইত্যাদি বর্ণ থাকবে তবে আপনার টার্মিনাল আউটপুটটি ধারকটির ইনপুটটিতে পাইপ করা হবে না। সুতরাং আপনার টাইপ করা অক্ষরগুলি পরবর্তী কমান্ডের জন্য সারিবদ্ধ করা হবে যা আপনি ডকার কমান্ডটি প্রস্থান করার পরে চালাবেন।
বিএমইচ

আমি কি ডকারের মধ্যে টিটি শুরু করতে পারি? আমার কাছে এমন কিছু অ্যাপ রয়েছে যা কাজ করা বন্ধ করে দেয় আমি ডকারটি চালাচ্ছি না -tতবে আমি ডকার স্টার্ট কমান্ডটি সংশোধন করতে পারি না। সুতরাং অ্যাপটি শুরু করে শুরু হয়েছে তা ভাবতে হবে -t
মোরেসেকেক

উত্তর:


9

এই উত্তরটি আমাকে মাথা ঘুরিয়ে দিতে সহায়তা করেছিল:

  • ডিফল্ট (ছাড়া তন্ন তন্ন দ্বারা -iকিংবা -tঅপশন) একটি Docker ধারক শুধুমাত্র stdout- এ তার আউটপুট পাঠায়,
  • সঙ্গে -iবিকল্প stdin সংযোগ আসে,
  • -tবিকল্পটি টার্মিনাল ইন্টারফেস ড্রাইভারের মধ্যে টানছে যা STDIN / STDOUT এর উপরে কাজ করে। এবং যখন কোনও টার্মিনাল ড্রাইভারকে টানানো হয়, একটি ধারকটির সাথে যোগাযোগ অবশ্যই টার্মিনাল ইন্টারফেস প্রোটোকলের সাথে মেনে চলতে হবে । একটি স্ট্রিং পাইপ না।

7

দেরিতে উত্তর, তবে কাউকে সাহায্য করতে পারে

docker run/exec -iকনটেইনারটির ভিতরে থাকা কমান্ডের STDINটিকে docker run/execনিজেই এটির STDIN এর সাথে সংযুক্ত করবে।

সুতরাং

  • docker run -i alpine catইনপুটটির জন্য অপেক্ষা করে খালি লাইন দেয়। "হ্যালো" টাইপ করুন আপনি একটি ইকো পাবেন "হ্যালো"। আপনি সিটিআরএল + ডি না পাঠানো পর্যন্ত পাত্রে প্রস্থান ছাড়বে না কারণ মূল প্রক্রিয়াটি catঅসীম স্ট্রিমের ইনপুটটির জন্য অপেক্ষা করছে যা এর টার্মিনাল ইনপুট docker run
  • অন্যদিকে echo "hello" | docker -i run alpine cat"হ্যালো" মুদ্রণ করবে এবং তাত্ক্ষণিক প্রস্থান করবে কারণ catইনপুট স্ট্রিমটি শেষ হয়ে গেছে এবং নিজেই শেষ হয়ে গেছে বলে বিজ্ঞপ্তি।

docker psউপরের যে কোনও একটিটি বের হওয়ার পরে যদি আপনি চেষ্টা করেন তবে কোনও চলমান পাত্রে আপনি পাবেন না। উভয় ক্ষেত্রে, catনিজেই সমাপ্ত হয়ে গেছে, এভাবে ডকার কনটেইনারটি সমাপ্ত করেছে।

এখন "-t" এর জন্য এটি ডকারের অভ্যন্তরে মূল প্রক্রিয়াটি জানায় যে এর ইনপুটটি টার্মিনাল ডিভাইস।

সুতরাং

  • docker run -t alpine catআপনাকে একটি খালি লাইন দেবে, তবে আপনি যদি "হ্যালো" টাইপ করার চেষ্টা করেন তবে কোনও প্রতিধ্বনি পাবেন না। এটি কারণ যখন catটার্মিনাল ইনপুটটির সাথে সংযুক্ত থাকে, এই ইনপুটটি আপনার ইনপুটটির সাথে সংযুক্ত থাকে না। আপনি যে "হ্যালো" টাইপ করেছেন তা ইনপুটটিতে পৌঁছায়নি catcatকখনই আসে না এমন ইনপুটটির জন্য অপেক্ষা করছে।
  • echo "hello" | docker run -t alpine cat আপনাকে খালি লাইনও দেবে এবং সিটিআরএল-ডি-তে ধারকটি প্রস্থান করবে না তবে আপনি পাস করবেন না বলে আপনি একটি প্রতিধ্বনি "হ্যালো" পাবেন না -i

আপনি যদি সিটিআরএল + সি প্রেরণ করেন তবে আপনি নিজের শেলটি ফিরে পাবেন, তবে আপনি যদি 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ইনপুটটিকে tty হিসাবে বিবেচনা করা হয়নি এবং এভাবে ইনপুটটি মাস্কিং বা আউটপুট রঙ করার মতো tty নির্দিষ্ট আচরণ ব্যবহার করেননি।


4

একটি টিটিআই আপনাকে নির্দেশ করে যে আপনার একটি টার্মিনাল রয়েছে, যা এক্সটার্ম দ্বারা সরবরাহ করা হবে বা অনেকগুলি লিনাক্স কমান্ড লাইন ইন্টারফেসের একটি। এটির সাথে যুক্ত একটি কীবোর্ড এবং পাঠ্য আউটপুট ইন্টারফেস দরকার। এটি চাওয়ার সাধারণ কারণগুলি হ'ল রঙের পাঠ্য আউটপুট সমর্থন, বিভিন্ন কী সংমিশ্রণগুলি (তীর কীগুলির মতো) পরিচালনা করা এবং কার্সারটিকে পর্দার চারদিকে সরিয়ে নেওয়ার ক্ষমতা।

আপনার echoউদাহরণের মতো আপনি যখন কোনও আদেশকে ডকারে পাইপ করেন, তখন সেই পাইপটি ইনপুট হয় এবং সেই পাইপের কোনও টিটি ইন্টারফেস থাকে না, এটি কেবল পাঠ্যের একটি প্রবাহ। এটির সাথে টিটি তৈরির চেষ্টা করা ত্রুটি বার্তার ইঙ্গিত হিসাবে ব্যর্থ হবে।


আরও দেখুন: stackoverflow.com/a/43099210/596285
BMitch

"একটি কীবোর্ড এবং একটি আউটপুট ইন্টারফেস" এবং "STDIN / STDOUT" এর মধ্যে এখনও আমার একটি ফাঁক রয়েছে। স্পষ্টতই আপনি STDOUT এ "কার্সার অবস্থান" ধারণাটি প্রয়োগ করতে পারবেন না, কারণ STDOUT একটি পর্দা নয়, একটি স্ট্রিম। কী স্পেসিফিকেশনগুলি STDOUT এর শীর্ষে আউটপুট ইন্টারফেস বিমূর্ততা (আমার ধারণা) তা বর্ণনা করে?
মিখাইল ভাসিন

1
এটি একটি ইন্টারফেস যা স্টিডিন / স্টাডাউটের শীর্ষে চলে। en.wikipedia.org/wiki/POSIX_terminal_interface
BMitch
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.