त्रुटि "इनपुट डिवाइस एक TTY नहीं है"


425

मैं अपने से निम्नलिखित कमांड चला रहा हूं Jenkinsfile। हालाँकि, मुझे त्रुटि मिलती है "इनपुट डिवाइस एक TTY नहीं है"

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

क्या Jenkinsfileबिना इंटरेक्टिव मोड से स्क्रिप्ट चलाने का कोई तरीका है?

मेरे पास मूल रूप से एक फाइल है जिसे कहा जाता है script.shकि मैं डॉकर कंटेनर के अंदर चलना चाहूंगा।


* निक्स के लिए, ऐसा लगता है कि यहां कोई समाधान नहीं है। 'docker exec -i' काम नहीं करता है, न ही '-t'।
rjurney

1
@rjurney क्या आपको कभी डॉकॉर निष्पादन के लिए कोई समाधान मिला? मैंने कोशिश की है, -आई और -t के साथ कोई सफलता नहीं। docker exec -it mycontainer bash certbot --apache -d www.website.com --email *********@gmail.com --agree -s -n
हच

@ हच सॉरी, मुझे याद नहीं है :(
rjurney

जवाबों:


639

-itइसे गैर-संवादात्मक बनाने और TTY को निकालने के लिए अपनी cli से निकालें । यदि आपको या तो जरूरत नहीं है, जैसे कि जेनकींस या क्रोन स्क्रिप्ट के अंदर अपनी कमांड चलाना, तो आपको यह करना चाहिए।

या आप इसे बदल सकते हैं -iयदि आपके पास इनपुट कमांड है जिसे टीकेवाई से नहीं आता है। यदि आपके पास xyz | docker ...या docker ... <inputआपकी कमांड लाइन में कुछ है , तो ऐसा करें।

या -tयदि आप TTY समर्थन चाहते हैं, तो आप इसे बदल सकते हैं, लेकिन यह इनपुट डिवाइस पर उपलब्ध नहीं है। अपने लॉग में आउटपुट के रंग स्वरूपण के लिए ऐसा करें, या जब आप बाद में एक उचित टर्मिनल के साथ कंटेनर को संलग्न करते हैं।

या यदि आपको एक इंटरैक्टिव टर्मिनल की आवश्यकता है और लिनक्स या मैकओएस पर टर्मिनल में नहीं चल रहे हैं, तो एक अलग कमांड लाइन इंटरफ़ेस का उपयोग करें। PowerShell को Windows पर इस समर्थन को शामिल करने की सूचना है।


एक TTY क्या है? यह एक टर्मिनल इंटरफ़ेस है जो कलर आउटपुट, एस्केप सीक्वेंस, कर्सर को इधर-उधर करने आदि का समर्थन करता है, जो कि मेनफ्रेम से जुड़े डंबल टर्मिनलों के पुराने दिनों से आता है। आज यह लिनक्स कमांड टर्मिनलों और ssh इंटरफेस द्वारा प्रदान किया जाता है। देखें अधिक जानकारी के लिए विकिपीडिया लेख


10
मैं mysql -pएक पासवर्ड निर्दिष्ट किए बिना इस आदेश का उपयोग कर रहा हूं । केवल -iपासवर्ड प्रॉम्प्ट जोड़ते समय कभी प्रकट नहीं होता है। बस जोड़ने -tके साथ प्रॉम्प्ट प्रकट होता है, लेकिन यह इनपुट को पढ़ने के लिए नहीं लगता है (जो कि प्रॉम्प्ट द्वारा छिपाए जाने के बजाय शाब्दिक रूप से मुद्रित किया जाता है) बिल्कुल भी नहीं, यहां तक ​​कि रिटर्न मारते समय भी नहीं; केवल ctrl-c इसे समाप्त कर सकता है। क्या किसी तरह से mysql क्लाइंट का उपयोग करना संभव है?
ओहसीबी

95

जो लोग इस त्रुटि के साथ संघर्ष करते हैं और विंडोज पर बैश करते हैं, बस पावरशेल का उपयोग करें जहां -itपूरी तरह से काम करता है।


12
इस सवाल का जवाब नहीं है। सवाल जेनकींस में डॉकटर के बारे में है, न कि विंडोज पर बैश करने का।

44
कुंआ। सच है, और यह कभी करने का इरादा नहीं था। जब आप इस विशिष्ट त्रुटि संदेश को खोजते हैं तो यह प्रश्न Google में पॉप अप हो जाता है। मुझे लगा, बेहतर होगा कि इसका जवाब कहीं न हो, बिल्कुल नहीं। स्पष्ट रूप से कुछ लोगों को यह उपयोगी लगा :) :)
Piotr Justyna

3
शेल ऑपरेशंस के लिए TTY के रूप में पॉवर्सशेल के साथ समस्या यह है कि यह साइकल कीज को ठीक से पास नहीं करता है, जैसे साइकलिंग कमांड हिस्ट्री के लिए अप एरो। उस कमी को छोड़कर महान काम करता है।
Corgalore

2
यदि आप Git Bash का उपयोग जारी रखना चाहते हैं, तो एक अन्य प्रश्न पर इस उत्तर को देखें या नीचे दिए गए खाली उत्तर को देखें
tessafyi

67

यह बिल्कुल वैसा नहीं है जैसा आप पूछ रहे हैं, बल्कि:

-टी कुंजी लोग हैं, जो प्रयोग कर रहे हैं मदद मिलेगी डोकर-लिखें कार्यकारी!

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

2
ठीक वही जो मेरे द्वारा खोजा जा रहा था। क्या आप जानते हैं कि यह क्यों काम करता है?
उलद कासच

6
बस मुझे भी जो चाहिए था। सहायता के अनुसार: -T को छद्म ट्टी आवंटन अक्षम करें। डिफ़ॉल्ट docker-compose exec रूप से एक TTY आवंटित करता है।
टीएस

धन्यवाद दोस्त। मैं इसे डॉकटर-कंपोज के लिए खोजता हूं!
ADyDyka

यह मेरे लिए काम किया!
रोलोरेंज़ो

58

यदि आप खिड़कियों पर गिट बैश का उपयोग कर रहे हैं (मेरे जैसे), तो आपको बस डालने की जरूरत है

winpty

आपकी 'docker line' से पहले:

winpty docker exec -it some_cassandra bash

आप कैसे डाउनलोड करते हैं winpty?
मोर शेमेश

6
पूछने से पहले आपने कोशिश की थी? मुझे लगता है कि यह Git के साथ आता है (मेरा अंदर है ... / Git / usr / bin)
Gremi64

आप रहे हों तो सही है, यह के अंतर्गत हैC:\Program Files\Git\usr\bin\winpty.exe
मोर Shemesh

31

मेरा मानना ​​है कि आपको एक TTY ( -tविकल्प) आवंटित करने में सक्षम होने के लिए doy के लिए TTY में होने की आवश्यकता है । जेनकींस अपने कामों को एक TTY में नहीं करता है ।

कहा जा रहा है कि, जो स्क्रिप्ट आप जेनकिंस के भीतर चला रहे हैं वह आप स्थानीय रूप से भी चलाना चाह सकते हैं। उस स्थिति में TTY आवंटित करना वास्तव में सुविधाजनक हो सकता है ताकि आप इसे स्थानीय रूप से चलाने पर ctrl+ जैसे सिग्नल भेज सकें c

इसे ठीक करने के लिए अपनी स्क्रिप्ट को वैकल्पिक रूप से -tविकल्प का उपयोग करें , जैसे:

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

यह त्रुटि मेरे लिए तब होती है जब docker run…कमांड फॉर्म एक मेकफाइल कार्य को एक गिट हुक द्वारा ट्रिगर करता है
arddouard Lopez

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

जब तक आप "जैसे माउंटेड पॉइंट" या "$ {pwd}: / माउंटपॉइंट" जैसे वॉल्यूम को निर्दिष्ट नहीं करते, तब तक काम करता है

सबसे अच्छा वर्कअराउंड मैंने पाया है कि विजुअल कोड स्टूडियो के अंदर git-bash प्लगइन का उपयोग करना है और कंटेनरों को शुरू करने और रोकने के लिए टर्मिनल का उपयोग करना है।


1

मुझे पता है कि यह सीधे हाथ पर सवाल का जवाब नहीं दे रहा है, लेकिन इस सवाल पर आने वाले किसी भी व्यक्ति के लिए जो विंडोज़ और cmder या conemu के लिए WSL रनिंग Docker का उपयोग कर रहा है।

यह ट्रिक डॉकर का उपयोग करने के लिए नहीं है जो / mnt / c / Program Files / Docker / Docker / Resources / bin / docker.exe पर विंडोज़ पर स्थापित है, बल्कि ubuntu / linux Docker को स्थापित करने के लिए नहीं है। यह इंगित करने के लायक है कि आप डॉकर को WSL के भीतर से नहीं चला सकते हैं, लेकिन आप लिनक्स डॉकर क्लाइंट से विंडोज़ के लिए डॉकर से कनेक्ट कर सकते हैं।

लिनक्स पर डॉकर स्थापित करें

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

या docker_host चर सेट करें जो आपको -H स्विच को छोड़ देने की अनुमति देगा

export DOCKER_HOST=tcp://localhost:2375

अब आप एक tty टर्मिनल सत्र के साथ अंतःक्रियात्मक रूप से जुड़ने में सक्षम होना चाहिए।


0

नीचे दिखाया गया मेरा जेनकिंस पाइपलाइन कदम एक ही त्रुटि के साथ विफल रहा।

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

मेरी " build.sh " स्क्रिप्ट फ़ाइल में " docker run " कमांड आउटपुट यह त्रुटि तब करता है जब इसे जेनकिंस जॉब द्वारा निष्पादित किया गया था। हालाँकि, यह ठीक काम कर रहा था जब स्क्रिप्ट शेल टर्मिनल में चली गई थी। त्रुटि के कारण -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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.