ত্রুটি "ইনপুট ডিভাইসটি টিটিওয়াই নয়"


425

আমি আমার থেকে নিম্নলিখিত কমান্ডটি চালাচ্ছি Jenkinsfile। যাইহোক, আমি ভুল পান "ইনপুট ডিভাইস একটি পির TTY নয়"

docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh

Jenkinsfileইন্টারেক্টিভ মোড না করে স্ক্রিপ্টটি চালানোর কোনও উপায় আছে ?

আমার কাছে মূলত একটি ফাইল রয়েছে script.shযা আমি ডকারের ধারকের ভিতরে চালাতে চাই।


* নিক্সের জন্য, দেখে মনে হচ্ছে এখানে কোনও সমাধান নেই। 'ডকার এক্সিকিউটিআই' কাজ করে না, বা '-t' করে না।
rjurney

1
@rjurney আপনি কি কখনও ডকার এক্সেকের জন্য কোনও সমাধান খুঁজে পেয়েছেন? আমি চেষ্টা করেছি এবং আমি কোনও সাফল্য পাইনি। Docker Exec -এটা mycontainer ব্যাশ certbot --apache -d www.website.com --email *********@gmail.com --agree-TOS -n
হাচ

@ হাচ দুঃখিত, আমি মনে করতে পারি না :(
rjurney

উত্তর:


639

সরান -itআপনার CLI থেকে এটা অ মিথস্ক্রিয় করতে এবং পির TTY মুছে ফেলার জন্য। আপনার যদি প্রয়োজন হয় না, যেমন জেনকিনস বা ক্রোন স্ক্রিপ্টের ভিতরে আপনার কমান্ডটি চালানো, আপনার এটি করা উচিত।

অথবা আপনি -iকোনও টিটিওয়াই থেকে আসে না এমন ডকার কমান্ডে ইনপুট পাইপ করা থাকলে আপনি এটিকে পরিবর্তন করতে পারেন। আপনার কমান্ড লাইনের মতো xyz | docker ...বা কিছু থাকলে docker ... <input, এটি করুন।

অথবা আপনি এটি -tটিটিওয়াই সমর্থন চাইলে এটিকে পরিবর্তন করতে পারেন তবে ইনপুট ডিভাইসে এটি উপলব্ধ নেই। আপনার লগগুলিতে আউটপুটটির রঙিন বিন্যাসকরণের জন্য, বা পরে কোনও সঠিক টার্মিনাল সহ ধারকটির সাথে সংযুক্ত করার জন্য এটি করুন।

অথবা যদি আপনার একটি ইন্টারেক্টিভ টার্মিনাল প্রয়োজন হয় এবং লিনাক্স বা ম্যাকোস-এ টার্মিনালে চলছে না, তবে একটি আলাদা কমান্ড লাইন ইন্টারফেস ব্যবহার করুন। পাওয়ারশেলটি উইন্ডোজে এই সমর্থনটি অন্তর্ভুক্ত করেছে বলে জানা গেছে।


টিটিওয়াই কী? এটি একটি টার্মিনাল ইন্টারফেস যা রঙিন আউটপুট, এস্কেপ সিকোয়েন্সগুলি, কার্সারকে প্রায় ঘুরিয়ে দেওয়া ইত্যাদি সমর্থন করে যা মেনফ্রেমে সংযুক্ত বোবা টার্মিনালের পুরানো দিনগুলি থেকে আসে। আজ এটি লিনাক্স কমান্ড টার্মিনাল এবং ssh ইন্টারফেস সরবরাহ করে। দেখুন আরো বিস্তারিত জানার জন্য Wikipedia নিবন্ধটি


10
আমি mysql -pকোনও পাসওয়ার্ড নির্দিষ্ট না করেই এই কমান্ডটি ব্যবহার করছি । -iপাসওয়ার্ড প্রম্পট যুক্ত করার সময় কখনই উপস্থিত হয় না। কেবলমাত্র -tপ্রম্পট যুক্ত করার সাথে উপস্থিত হয় তবে মনে হয় ইনপুটটি (যা প্রম্পট দ্বারা আড়াল করার পরিবর্তে আক্ষরিকভাবে মুদ্রিত হয়) কিছু না, এমনকি রিটার্নকে আঘাত করার পরেও নয়; কেবল সিটিআরএল-সি এটি শেষ করতে পারে। কীভাবে কোনও উপায়ে ডকারের সাথে মাইএসকিএল ক্লায়েন্ট ব্যবহার করা সম্ভব?
ওহসিবি

95

যারা এই ত্রুটিটি এবং উইন্ডোজে গিট ব্যাশের সাথে লড়াই করছেন তাদের জন্য কেবল পাওয়ারশেল ব্যবহার করুন যেখানে -itপুরোপুরি কার্যকর হয়।


12
এটি প্রশ্নের উত্তর দেয় না। প্রশ্নটি জেনকিন্সের ডকার সম্পর্কে, উইন্ডোজে গিট ব্যাশ নয়।

44
আমরা হব. সত্য, এবং এটি কখনই উদ্দেশ্য ছিল না। আপনি যখন এই নির্দিষ্ট ত্রুটির বার্তাটি অনুসন্ধান করেন তখন প্রশ্নটি গুগলে পপ আপ হয়। আমি মূর্ত, ভাল উত্তর আছে কোথাও এ সব এটা আছে না চেয়ে। স্পষ্টতই কিছু লোক এটি দরকারী বলে মনে হয়েছে :)
পাইওটার জাস্টিনা

3
শেল অপারেশনের জন্য টিটিওয়াই হিসাবে পাওয়ারশেলের সমস্যাটি হ'ল এটি সাইক্লিং কমান্ডের ইতিহাসের আপ আপের মতো তীর কীগুলি সঠিকভাবে পাস করে না। অভাব ছাড়া অন্য দুর্দান্ত কাজ করে।
Corgalore

2
আপনি যদি গিট ব্যাশ ব্যবহার অবিরত করতে চান তবে অন্য উত্তরটির নীচে
tessafyi

67

আপনি যা জিজ্ঞাসা করছেন এটি ঠিক তা নয়, তবে:

-T কী যারা ব্যবহার করছেন সাহায্য করবে Docker-রচনা Exec!

docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup

2
ঠিক আমি খুঁজছেন ছিল কি. আপনি জানেন কেন এটি কাজ করে?
উলাদ কাসাচ

6
আমারও খুব দরকার ছিল। সহায়তা অনুসারে: -T সিউডো-টিটি বরাদ্দ অক্ষম করুন। ডিফল্টরূপে docker-compose exec একটি টিটিওয়াই বরাদ্দ করে।
টিএস

ধন্যবাদ মানুষ. আমি এটি ডকার-রচনার জন্য অনুসন্ধান করছি!
এডিডাইকা

এটি আমার পক্ষে কাজ করেছিল!
রোরেঞ্জো

58

আপনি যদি উইন্ডোতে গিট ব্যাশ ব্যবহার করেন (আমার মতো) তবে আপনার কেবল দরকার to

winpty

আপনার 'ডকার লাইনের' আগে:

winpty docker exec -it some_cassandra bash

আপনি কিভাবে ডাউনলোড করবেন winpty?
মোড় শিমেশ

6
জিজ্ঞাসার আগে আপনি চেষ্টা করেছিলেন? আমি মনে করি এটি গিট (আমার ভিতরে আছে ... / গিট /
ইউএসআর

আপনি ঠিক বলেছেন, এটির অধীনেC:\Program Files\Git\usr\bin\winpty.exe
মর শেমস

31

আমি বিশ্বাস করি যে ডকারের জন্য একটি টিটিওয়াই ( -tবিকল্প) বরাদ্দ করতে সক্ষম হতে আপনার একটি টিটিওয়াইতে থাকা দরকার । জেনকিন্স কোনও টিটিওয়াইয়ের মাধ্যমে নয় তার কাজগুলি কার্যকর করে ।

এটি বলার পরে, আপনি যে স্ক্রিপ্টটি জেনকিনসের মধ্যে চলছে তা আপনি স্থানীয়ভাবে চালাতে চাইতে পারেন। সেক্ষেত্রে একটি টিটিওয়াই বরাদ্দ করা সত্যিই সুবিধাজনক হতে পারে যাতে আপনি স্থানীয়ভাবে এটি চালনার সময় ctrl+ এর মতো সংকেত পাঠাতে পারেন c

এটি ঠিক করতে আপনার স্ক্রিপ্টটি বিকল্পভাবে -tবিকল্পটি ব্যবহার করুন , যেমন:

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...

এই ত্রুটিটি আমার কি যখন চলমান docker run…কমান্ড ফর্ম একটি Makefile টাস্কের একটি Git হুক দ্বারা আলোড়ন সৃষ্টি
Edouard লোপেজ

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি আসলে সর্বজনীনভাবে প্রযোজ্য পদ্ধতিতে সমস্যাটি সমাধান করে
রুটাহন

11

'গিট বাশ' ব্যবহার করার সময়,

1) আমি আদেশটি কার্যকর করি:

docker exec -it 726fe4999627 /bin/bash

আমার ত্রুটি আছে:

the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

2) তারপরে, আমি আদেশটি কার্যকর করি:

winpty docker exec -it 726fe4999627 /bin/bash

আমার আরও একটি ত্রুটি রয়েছে:

OCI runtime exec failed: exec failed: container_linux.go:344: starting container process caused "exec: \"D:/Git/usr/bin/
bash.exe\": stat D:/Git/usr/bin/bash.exe: no such file or directory": unknown

3) তৃতীয়, আমি কার্যকর:

winpty docker exec -it 726fe4999627 bash

এটা কাজ করেছে.

যখন আমি 'পাওয়ারশেল' ব্যবহার করি তখন সমস্ত ভাল কাজ করে।


বাশ ব্যবহার করে এই সমস্যাগুলি নিয়ে কয়েক ঘন্টার জন্য আমার মাথাটি প্রাচীরের বিরুদ্ধেও বেঁধে দিন। পাওয়ারশলে স্যুইচ করা হয়েছে এবং এখন সমস্ত কাজ!
ডেভিড স্পেনার্ড


1

উইন্টারপিটি যতক্ষণ কাজ করে আপনি ":: / মাউন্টপয়েন্ট" বা "$ {পিডব্লিউড}: / মাউন্টপয়েন্ট" এর মতো ভলিউমগুলি নির্দিষ্ট না করেন ততক্ষণ কাজ করে

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


1

আমি জানি যে এটি সরাসরি প্রশ্নের উত্তর দিচ্ছে না তবে যে কেউ এই প্রশ্নটির উপরে আসেন যারা উইন্ডোজ এবং সেন্টিমিটার বা কনিমুর জন্য ডাব্লুএসএল চালিত ডকার ব্যবহার করছেন।

কৌতুকটি ডকারকে ব্যবহার করা নয় যা উইন্ডোজে / এমএনটি / সি / প্রোগ্রাম ফাইল / ডকার / ডকার / রিসোর্স / বিন / ডকার.এক্সে ইনস্টল করা আছে তবে উবুন্টু / লিনাক্স ডকার ইনস্টল করার জন্য। এটি উল্লেখ করার মতো যে আপনি ডাব্লারএসএল থেকে ডকার নিজেই চালাতে পারবেন না তবে আপনি লিনাক্স ডকার ক্লায়েন্টের উইন্ডোজের জন্য ডকারের সাথে সংযোগ করতে পারেন।

লিনাক্সে ডকার ইনস্টল করুন

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce

2375 বন্দরটিতে উইন্ডোজের জন্য ডকারের সাথে সংযোগ করুন যা উইন্ডোজের জন্য ডকারে সেটিংস থেকে সক্ষম করা দরকার।

docker -H localhost:2375 run -it -v /mnt/c/code:/var/app -w "/var/app" centos:7

অথবা ডকার_হোস্ট ভেরিয়েবল সেট করুন যা আপনাকে -H সুইচ বাদ দিতে দেয়

export DOCKER_HOST=tcp://localhost:2375

আপনার এখন একটি টিটিএম টার্মিনাল সেশনের সাথে ইন্টারেক্টিভভাবে সংযোগ করতে সক্ষম হওয়া উচিত।


0

নীচে দেখানো আমার জেনকিনস পাইপলাইন ধাপ একই ত্রুটির সাথে ব্যর্থ হয়েছে।

       steps {
            echo 'Building ...' 
            sh 'sh ./Tools/build.sh'
        }

আমার " বিল্ড.শ " স্ক্রিপ্ট ফাইলটিতে " ডকার রান " কমান্ড আউটপুট এই ত্রুটিটি যখন জেনকিন্স কাজ দ্বারা কার্যকর করা হয়েছিল। তবে এটি ঠিক আছে কাজ ছিল যখন শেল terminal.The ভুলবশত স্ক্রিপ্ট দৌড়ে কারণে ঘটেছে -t প্রেরণ বিকল্প Docker রান কমান্ড যেমন আমি জানি টার্মিনাল বরাদ্দ করা যে চেষ্টা এবং যদি সেখানে বরাদ্দ করা কোন টার্মিনাল ব্যর্থ।

আমার ক্ষেত্রে আমি স্ক্রিপ্টটি পাস-টি বিকল্পে পরিবর্তিত করেছি কেবল যদি কোনও টার্মিনাল সনাক্ত করা যায়। পরিবর্তনের পরে কোডটি এখানে:

DOCKER_RUN_OPTIONS="-i --rm"

# Only allocate tty if we detect one
if [ -t 0 ] && [ -t 1 ]; then
    DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -t"
fi

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