দেরিতে উত্তর, তবে কাউকে সাহায্য করতে পারে
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 নির্দিষ্ট আচরণ ব্যবহার করেননি।