দেরিতে উত্তর, তবে কাউকে সাহায্য করতে পারে
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টার্মিনাল ইনপুটটির সাথে সংযুক্ত থাকে, এই ইনপুটটি আপনার ইনপুটটির সাথে সংযুক্ত থাকে না। আপনি যে "হ্যালো" টাইপ করেছেন তা ইনপুটটিতে পৌঁছায়নি cat। catকখনই আসে না এমন ইনপুটটির জন্য অপেক্ষা করছে।
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 নির্দিষ্ট আচরণ ব্যবহার করেননি।