সিউডো-টিটিওয়াই বরাদ্দ করার জন্য ডকার-টি বিকল্প সম্পর্কে বিভ্রান্ত


206

এই বিকল্পটি ঠিক কী করে? আমি টিটিওয়াইতে অনেক পড়ছি এবং এখনও বিভ্রান্ত। আমি না সঙ্গে প্রায় অভিনয় -tএবং মাত্র -iএবং এটি প্রোগ্রাম আশা ব্যবহারকারীর ইনপুট ছাড়াই একটি ত্রুটি নিক্ষেপ মত মনে হয় -t। সিউডো-টিটিওয়াইয়ের সক্ষম হওয়া কেন গুরুত্বপূর্ণ?

উত্তর:


223

-tবিকল্প কিভাবে ইউনিক্স / লিনাক্স টার্মিনাল এক্সেস পরিচালনা যায়। অতীতে, একটি টার্মিনালটি একটি হার্ডলাইন সংযোগ ছিল, পরে মডেম ভিত্তিক সংযোগ ছিল। এগুলির শারীরিক ডিভাইস ড্রাইভার ছিল (তারা ছিল সরঞ্জামের আসল অংশ)। জেনারালাইজড নেটওয়ার্কগুলি একবার ব্যবহারে আসার পরে, একটি সিউডো-টার্মিনাল ড্রাইভার তৈরি করা হয়েছিল। এটি কারণ আপনার প্রোগ্রামটিতে সরাসরি লেখার প্রয়োজন ছাড়াই টার্মিনাল ক্ষমতাগুলি কীভাবে ব্যবহার করা যায় তা বোঝার মধ্যে একটি বিভাজন তৈরি করে (ম্যান পৃষ্ঠাগুলি পড়ুন stty, curses)।

সুতরাং, ব্যাকগ্রাউন্ড হিসাবে, কোনও বিকল্প ছাড়াই একটি ধারক চালান এবং ডিফল্টরূপে আপনার স্টাডাউট স্ট্রিম থাকে (সুতরাং docker run | <cmd>কাজ করে); সাথে চালান -i, এবং আপনি স্টিডিন স্ট্রিম যোগ করুন (সুতরাং <cmd> | docker run -iকাজ করে); ব্যবহার করুন -t, সাধারণত সংমিশ্রণে -itএবং আপনার সাথে একটি টার্মিনাল ড্রাইভার যুক্ত হয়, যা আপনি যদি প্রক্রিয়াটির সাথে ইন্টারঅ্যাক্ট করেন তবে সম্ভবত আপনি যা চান তা সম্ভবত। এটি মূলত ধারকটিকে টার্মিনাল সংযোগ সেশনের মতো দেখতে শুরু করে।


7
এটি শীর্ষ উত্তর হওয়া উচিত। যদিও এটি এখানে সবচেয়ে প্রযুক্তিগত নয়, এটি -itপতাকাগুলির মৌলিক আচরণটি ব্যাখ্যা করে ।
ক্রিস খাইরা

1
ক্রিসের সাথে একমত আমি অন্যান্য উত্তরগুলি পড়েছি এবং এখনও সম্পূর্ণ বিভ্রান্ত ছিলাম। এই উত্তর এটি পরিষ্কার করে দেয়।
বেন লি

3
হ্যাঁ, এটি উল্লেখ করার মতো মূল্য আছে যে "টিটিওয়াই" নিজেই একটি "টেলিটাইপাইটার" (একেএ "টেলিফিন্টার") শব্দ থেকে আসা একটি সংক্ষিপ্ত শব্দ যা আপনাকে একই সময়ে পাঠ্য টাইপ করতে এবং পাঠিয়ে দেওয়ার অনুমতি দেয় এমন একটি ডিভাইসের নাম - যেমন টেলিফোনের মতো পাঠ্যের জন্য ;-) চেষ্টা করুন docker run -i ubuntuএবং docker run -it ubuntuআপনি তাত্ক্ষণিকভাবে পার্থক্যটি দেখতে পাবেন। "-i" আপনাকে হোস্টের সাথে মিথস্ক্রিয়াটির জন্য অপেক্ষা করতে কন্টেইনার তৈরি করার অনুমতি দেয় তবে কনসোল (টার্মিনাল) থেকে প্রকৃত মিথস্ক্রিয়াটি আপনি "tt ড্রাইভার" বরাদ্দ "পতাকা" -র পরে সম্ভব হয়।
জেগার

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

97

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

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ইনপুট স্ট্রিমটি শেষ হয়ে গেছে এবং নিজেই শেষ হয়ে গেছে not

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

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

সুতরাং

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

যদি আপনি CTRL+ প্রেরণ করেন তবে আপনি Cনিজের শেলটি ফিরে পাবেন, তবে আপনি যদি 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 -u root -pআপনাকে একটি পাসওয়ার্ড প্রম্পট দেবে। আপনি যদি পাসওয়ার্ডটি টাইপ করেন তবে অক্ষরগুলি দৃশ্যমানভাবে মুদ্রিত হবে।
  • docker run -i alpine shআপনাকে খালি লাইন দেবে আপনি যদি lsআউটপুট পান এমন কমান্ডটি টাইপ করেন তবে আপনি কোনও প্রম্পট বা রঙিন আউটপুট পাবেন না।

শেষ দুটি ক্ষেত্রে, আপনি এই আচরণটি পেয়েছেন কারণ mysqlপাশাপাশি shellইনপুটটিকে tty হিসাবে বিবেচনা করা হয়নি এবং এভাবে ইনপুটটি মাস্কিং বা আউটপুট রঙ করার মতো tty নির্দিষ্ট আচরণ ব্যবহার করেননি।


6
এখানে সর্বোত্তম উত্তর যা আমাকে সত্যই বুঝতে দেয় -tএবং -iবিকল্পগুলি কী করে!
রুসলান স্টেলমাচেঙ্কো

1
চমত্কার উত্তর যা আমার প্রতিটি প্রশ্নের প্রত্যাশা করেছিল
জেমস মাচিন

@ আহমেদ ঘোনিম, খুব ভাল উত্তর। ধন্যবাদ. তবে "এটি কারণ যদি কমান্ডগুলি ইনপুটটিকে টার্মিনাল করে তবে আলাদাভাবে আচরণ করবে", আমি মনে করি এটি একটি ভুল টাইপ, তাই না? এটি হওয়া উচিত "এটি কারণ কমান্ডগুলি ইনপুটটিকে টার্মিনাল না করে অন্যভাবে আচরণ করে ", তাইনা?
tuq

@ আহমেদ ঘোনিম স্ফটিক পরিষ্কার। তবে ডকার রান-এ = স্টিডিন আলপাইন বিড়াল সম্পর্কে কী?
এইচকিআইটি

1
@HKIIT "-a = stdin" স্ট্যান্ডিন স্ট্রিমটি ধারকটিতে সংযুক্ত করে তবে মেমরির বরাদ্দ ছাড়াই। এটি -i পতাকা যা স্টিডিন স্ট্রিমের জন্য ধারকটিতে বাফার মেমরির বরাদ্দ করে, তাই "সংযুক্তিযুক্ত পতাকাগুলি নির্বিশেষে স্ট্যান্ডিনের জন্য এসটিডিআইএন উন্মুক্ত রাখুন", যখন বিবরণটি স্ট্যান্ডিনের জন্য বরাদ্দ করা হয়। এই বরাদ্দ মেমরি ছাড়া স্টাডিন পাঠানো খালি / eof হয়। এছাড়াও বিড়াল কমান্ডের প্রতিক্রিয়া দেখতে আপনাকে "-a = stdout" অন্তর্ভুক্ত করতে হবে উদাহরণস্বরূপ: "ডকার চালানো -i -a = stdin -a = stdout আল্পাইন বিড়াল" ... অবশ্যই এটি করার দরকার নেই কেবল "ডকার রান -আই আলপাইন বিড়াল" চালান।
ডেভিড ডি

71

-tযুক্তি ভাল একটি Google অনুসন্ধান অনুযায়ী নথিভুক্ত করা না, অথবা উল্লেখিত প্রায়ই অনেক মানুষ।

এমনকি আপনি dockerবাশ প্রম্পটে টাইপ করে (1.8.1 এর সর্বশেষতম সংস্করণ সহ ) সমস্ত ডকার ক্লায়েন্ট যুক্তির একটি তালিকা প্রদর্শন করার পরে এটি প্রদর্শিত হয় না ।

প্রকৃতপক্ষে, আপনি docker -t --helpযদি এই আশ্চর্যজনকভাবে অস্পষ্ট উত্তরটি দিয়ে থাকেন তবে টাইপ করে এই যুক্তি সম্পর্কে সুনির্দিষ্ট সহায়তা পাওয়ার চেষ্টা করেন :

পতাকা সরবরাহ করা হয়েছে তবে সংজ্ঞায়িত হয়নি: -t

সুতরাং, এই যুক্তি সম্পর্কে বিভ্রান্ত হওয়ার জন্য আপনাকে দোষ দেওয়া যাবে না!

ডকার অনলাইন ডকুমেন্টেশনে একটি উল্লেখ রয়েছে যা বলে যে এটি "একটি সিডো-টিটি বরাদ্দ করা" এবং এটি প্রায়শই ব্যবহৃত হয় -i:

https://docs.docker.com/reference/run/

আমি এটি নীচে ভয়ঙ্কর jwilder/nginx-proxyডকার ধারক জন্য ডকুমেন্টেশনে ব্যবহৃত দেখেছি :

docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx

এই ক্ষেত্রে, এটি যা করে তা হ'ল এই ডকার পাত্রে থাকা 'ভার্চুয়াল' টিটি (বাশ কমান্ড প্রম্পট / টার্মিনাল) এ আউটপুট প্রেরণ করা। এরপরে ডকার কমান্ড চালিয়ে আপনি এই আউটপুটটি দেখতে পাবেন docker logs CONTAINERযেখানে এই ধারকটির CONTAINERআইডির প্রথম দু'টি অক্ষর। এই কন্টেইনার আইডি টাইপ করে পাওয়া যাবেdocker ps -a

আমি এই -tযুক্তিটি নীচের লিঙ্কটিতে সংক্ষেপে উল্লেখ করেছি , যেখানে এটি বলে

-tএবং -iপতাকা একটি সিউডো-TTY বরাদ্দ এবং খোলা stdin এমনকি যদি সংযুক্ত করা রাখা। এটি যতক্ষণ না ব্যাশ প্রম্পট চলছে ততক্ষণ আপনি traditionalতিহ্যবাহী ভিএম এর মতো ধারকটি ব্যবহার করতে পারবেন।

https://coreos.com/os/docs/latest/getting-started-with-docker.html

আশা করি এটা কাজে লাগবে! আমি নিশ্চিত নই কেন এটি নথিভুক্ত বা বেশি ব্যবহার করা হচ্ছে না। হতে পারে এটি পরীক্ষামূলক এবং আসন্ন সংস্করণগুলিতে একটি ডকুমেন্টেড বৈশিষ্ট্য হিসাবে প্রয়োগ করা হবে।


21
জন্য ডকুমেন্টেশন শো docker run --help, না docker -t --help: -t, --tty=false Allocate a pseudo-TTY"
bskaggs

5

আমি যা সম্পর্কে জানি -tতা নিম্নলিখিত:

docker exec -ti CONTAINER bash- আমাকে ধারকটিতে "লগইন" করতে দেয়। এটি ssh-ing এর মতো অনুভব করে (এটি নয়)।

কিন্তু সমস্যাটি তখন ছিল যখন আমি একটি ডাটাবেস পুনরুদ্ধার করতে চাইতাম।

সাধারণত আমি করি docker exec -ti mysql.5.7 mysql- এখানে আমি ধারকটিতে mysql কমান্ড কার্যকর করি এবং একটি ইন্টারেক্টিভ টার্মিনাল পাই।

আমি <dump.sqlআগের কমান্ডটিতে যুক্ত করেছি যাতে আমি একটি ডিবি পুনরুদ্ধার করতে পারি। কিন্তু এটি সঙ্গে ব্যর্থ cannot enable tty mode on non tty input

-tসাহায্য সরানো হচ্ছে । এখনও বুঝতে পারছি না কেন:

docker exec -i mysql.5.7 mysql < dump.sql

শেষ এক কাজ করে। আশা করি এটি মানুষের সহায়তা করবে।


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

1

লিনাক্সে আপনি যখন কোনও কমান্ড চালাবেন, এটি সম্পাদন করার জন্য আপনার একটি টার্মিনাল (tty) প্রয়োজন।

সুতরাং আপনি যখন ডকারের সাথে সংযোগ স্থাপন করতে চান (বা ডকার পাত্রে কমান্ড রান করুন), আপনাকে বিকল্পটি প্রদান করতে হবে যা ডকারের ধারকটির ভিতরে টার্মিনালের বিবেচনায় নেয়।


0

প্রতিটি প্রক্রিয়া স্ট্রীম করে অর্থাত তিনটি ডেটা নেই STDIN/ STDOUT/ STDERR। যখন কোনও ধারকটিতে কোনও প্রক্রিয়া চলমান থাকে, তখন ডিফল্টরূপে টার্মিনালটি ধারকটিতে চলমান প্রক্রিয়াটির STDOUT স্ট্রিমের সাথে সংযুক্ত থাকে। docker runটার্মিনালে কমান্ড চলাকালীন সমস্ত আউটপুট স্ট্রিম দৃশ্যমান হবে । তবে আপনি যদি ধারকটিতে চলমান প্রক্রিয়াটিতে ইনপুট সরবরাহ করতে চান তবে আপনাকে প্রক্রিয়াটির STDIN চ্যানেলের সাথে সংযোগ করতে হবে যা পূর্বনির্ধারিত নয় এবং docker run -iকমান্ড দিয়ে সম্পন্ন হয় ।

-t ইন্টারেক্টিভ / ফর্ম্যাট করা ইনপুট ক্রিয়াকলাপের জন্য ব্যবহৃত হয়।


-3

-itএকটি সিউডো-পির TTY ধারক এর stdin সংযুক্ত বরাদ্দ করা, কন্টেইনারে একটি ইন্টারেক্টিভ ব্যাশ শেল তৈরি Docker নির্দেশ দেয়।

--interactive, -i falseসংযুক্ত না থাকলেও STDIN খোলা রাখুন

--tty, -t false একটি সিডো-টিটিওয়াই বরাদ্দ করুন

https://docs.docker.com/engine/reference/commandline/run/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.