ข้อผิดพลาด“ อุปกรณ์อินพุตไม่ใช่ 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 คุณเคยพบวิธีแก้ปัญหาสำหรับนักเทียบท่า exec หรือไม่? ฉันได้ลอง -i และ -t โดยไม่ประสบความสำเร็จ นักเทียบท่า exec -it mycontainer ทุบตี certbot --apache -d www.website.com - อีเมล *********@gmail.com --agree-tos -n
ฮัทช์

@Hutch ขออภัยผมจำไม่ได้ :(
rjurney

คำตอบ:


639

ลบออก-itจาก cli ของคุณเพื่อไม่ให้มีการโต้ตอบและลบ TTY หากคุณไม่ต้องการเช่นใช้คำสั่งของคุณในสคริปต์เจนกินส์หรือ cron คุณควรทำเช่นนี้

หรือคุณสามารถเปลี่ยนเป็น-iหากคุณป้อน pip ไปยังคำสั่ง docker ที่ไม่ได้มาจาก TTY หากคุณมีสิ่งที่ชอบxyz | docker ...หรือdocker ... <inputในบรรทัดคำสั่งของคุณทำเช่นนี้

หรือคุณสามารถเปลี่ยนเป็น-tหากคุณต้องการการสนับสนุน TTY แต่ไม่มีอยู่ในอุปกรณ์อินพุต ทำสิ่งนี้สำหรับการจัดรูปแบบสีของเอาต์พุตในบันทึกของคุณหรือสำหรับเมื่อคุณแนบกับคอนเทนเนอร์ในภายหลังด้วยเทอร์มินัลที่เหมาะสม

หรือถ้าคุณต้องการเทอร์มินัลโต้ตอบและไม่ได้ทำงานในเทอร์มินัลบน Linux หรือ MacOS ให้ใช้อินเตอร์เฟสบรรทัดคำสั่งอื่น PowerShell ถูกรายงานเพื่อรวมการสนับสนุนนี้บน Windows


TTY คืออะไร มันเป็นส่วนต่อประสานเทอร์มินัลที่รองรับเอาท์พุทสีลำดับการหลบหลีกการเลื่อนเคอร์เซอร์ไปมา ฯลฯ ซึ่งมาจากยุคเก่าของเทอร์มินัลโง่ที่ติดอยู่กับเมนเฟรม วันนี้มีให้โดยเทอร์มินัลคำสั่ง Linux และอินเตอร์เฟส ssh ดูบทความวิกิพีเดียสำหรับรายละเอียดเพิ่มเติม


10
ฉันกำลังใช้คำสั่งนี้ร่วมกับmysql -pโดยไม่ระบุรหัสผ่าน เมื่อเพิ่งเพิ่ม-iพรอมต์รหัสผ่านจะไม่ปรากฏขึ้น ด้วยการเพิ่ม-tพรอมต์ปรากฏขึ้น แต่ดูเหมือนว่าจะไม่อ่านอินพุต (ซึ่งพิมพ์ตามตัวอักษรแทนที่จะถูกซ่อนโดยพรอมต์) เลยแม้แต่เมื่อกดปุ่มย้อนกลับ ctrl-c เท่านั้นที่สามารถจบได้ เป็นไปได้ไหมที่จะใช้ไคลเอนต์ mysql กับนักเทียบท่าแบบนั้น?
ohcibi

95

สำหรับผู้ที่ต่อสู้กับข้อผิดพลาดและ git bash บน Windows เพียงใช้ PowerShell ซึ่ง-itทำงานได้อย่างสมบูรณ์


12
นี่ไม่ได้ตอบคำถาม คำถามเกี่ยวกับนักเทียบท่าในเจนกินส์ไม่ใช่คอมไพล์ทุบตีใน Windows

45
ดี. จริงและมันไม่เคยตั้งใจที่จะ คำถามปรากฏขึ้นใน google เมื่อคุณค้นหาข้อความแสดงข้อผิดพลาดนี้ ฉันคิดว่าดีกว่าที่จะมีคำตอบที่ไหนดีกว่าที่จะไม่ได้เลย เห็นได้ชัดว่าบางคนเห็นว่ามีประโยชน์ :)
Piotr Justyna

3
ปัญหาของ Powershell ในฐานะ TTY สำหรับการทำงานของเชลล์คือมันไม่ผ่านปุ่มลูกศรเช่นลูกศรขึ้นสำหรับประวัติคำสั่งการขี่จักรยาน ใช้งานได้ดีนอกเหนือจากข้อบกพร่องนั้น
Corgalore

2
ถ้าคุณต้องการที่จะยังคงใช้ Git Bash ดูคำตอบเกี่ยวกับเรื่องนี้อีกคำถามหรือคำตอบที่ winpty ด้านล่าง
tessafyi

67

มันไม่ได้เป็นอย่างที่คุณขอ แต่:

สำคัญ -Tจะช่วยให้ผู้ที่กำลังใช้exec นักเทียบท่า-เขียน!

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

2
สิ่งที่ฉันกำลังมองหา คุณรู้ไหมว่าทำไมมันถึงได้ผล
Ulad Kasach

6
สิ่งที่ฉันต้องการเช่นกัน ตามวิธีใช้: -T ปิดใช้งานการจัดสรรหลอก tty โดยค่าเริ่มต้นdocker-compose exec จัดสรร TTY
TS

ขอบคุณชาย ฉันค้นหามันสำหรับนักเทียบท่าเขียน!
ADyDyka

สิ่งนี้ได้ผลสำหรับฉัน!
rlorenzo

59

หากคุณ (เช่นฉัน) โดยใช้ทุบตี git บน windows คุณเพียงแค่ต้องใส่

winpty

ก่อน 'สายเชื่อมต่อ' ของคุณ:

winpty docker exec -it some_cassandra bash

คุณดาวน์โหลดwinptyอย่างไร
Mor Shemesh

6
คุณลองก่อนถาม? ฉันคิดว่ามันมาพร้อมกับ Git (ของฉันอยู่ข้างใน ... / Git / usr / bin)
Gremi64

คุณพูดถูกมันอยู่ภายใต้C:\Program Files\Git\usr\bin\winpty.exe
หมอเชเมช

31

ฉันเชื่อว่าคุณต้องอยู่ใน TTY เพื่อให้นักเทียบท่าสามารถจัดสรร TTY ได้ ( -tตัวเลือก) เจนกินส์ดำเนินการงานไม่ได้อยู่ใน TTY

ต้องบอกว่าสคริปต์ที่คุณใช้ในเจนกินส์คุณอาจต้องการเรียกใช้ในเครื่อง ในกรณีนี้มันสะดวกมากที่จะจัดสรร TTY เพื่อให้คุณสามารถส่งสัญญาณเช่นctrl+cเมื่อใช้งานในเครื่อง

ในการแก้ไขปัญหานี้ให้สคริปต์ของคุณเลือกใช้-tตัวเลือกดังนี้:

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

ข้อผิดพลาดนี้เกิดขึ้นกับฉันเมื่อเรียกใช้docker run…คำสั่งในรูปแบบงาน makefile ที่ถูกเรียกโดย git hook
Édouard Lopez

1
นี่ควรเป็นคำตอบที่ยอมรับได้ จริง ๆ แล้วมันแก้ปัญหาในลักษณะที่ใช้ได้สากล
roothahn

11

เมื่อใช้ 'git bash'

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

มันทำงานได้

เมื่อฉันใช้ 'powershell' ทั้งหมดทำงานได้ดี


กระแทกหัวของฉันกับผนังเช่นกันสองสามชั่วโมงกับปัญหาเหล่านี้โดยใช้ทุบตี เปลี่ยนเป็น Powershell และใช้งานได้ทันที!
David Spenard

5

ถ้าใช้ windows ลองด้วย cmd สำหรับฉันมันใช้งานได้ ตรวจสอบว่านักเทียบท่าเริ่มต้นขึ้นแล้วหรือยัง


1

winpty ทำงานได้ตราบใดที่คุณไม่ได้ระบุโวลุ่มที่จะเมานต์เช่น ".: / mountpoint" หรือ "$ {pwd}: / mountpoint"

วิธีแก้ปัญหาที่ดีที่สุดที่ฉันพบคือใช้ปลั๊กอิน git-bash ภายใน Visual Code Studio และใช้เทอร์มินัลเพื่อเริ่มและหยุดภาชนะบรรจุหรือนักเทียบท่าประกอบ


1

ฉันรู้ว่านี่ไม่ใช่การตอบคำถามในมือโดยตรง แต่สำหรับทุกคนที่มาพร้อมกับคำถามที่ใช้ WSL ที่เรียกใช้ Docker สำหรับ windows และ cmder หรือ conemu

เคล็ดลับคือไม่ใช้ Docker ซึ่งติดตั้งบน windows ที่ / mnt / c / Program Files / Docker / Docker / resources / bin / docker.exe แต่ให้ติดตั้ง ubuntu / linux Docker เป็นสิ่งที่ชี้ให้เห็นว่าคุณไม่สามารถเรียกใช้ Docker ได้จากภายใน WSL แต่คุณสามารถเชื่อมต่อกับ Docker สำหรับ windows ได้จากไคลเอนต์ linux Docker

ติดตั้ง Docker บน Linux

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

เชื่อมต่อกับ Docker สำหรับ windows บนพอร์ต 2375 ซึ่งจำเป็นต้องเปิดใช้งานจากการตั้งค่าใน docker สำหรับ windows

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

ขั้นตอนไปป์ไลน์ Jenkins ของฉันที่แสดงด้านล่างล้มเหลวด้วยข้อผิดพลาดเดียวกัน

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

ในของฉัน "ไฟล์สคริปต์ " build.sh docker run " ออกคำสั่งข้อผิดพลาดนี้เมื่อมันถูกดำเนินการโดยงาน Jenkins อย่างไรก็ตามมันใช้งานได้ดีเมื่อสคริปต์รันในเชลล์เทอร์มินัลข้อผิดพลาดเกิดขึ้นเนื่องจากตัวเลือก-t ที่ถูกส่งไปยังคำสั่งdocker runซึ่งฉันรู้ว่าพยายามจัดสรรเทอร์มินัลและล้มเหลวหากไม่มีเทอร์มินัลจัดสรร

ในกรณีของฉันฉันได้เปลี่ยนสคริปต์ตัวเลือก pass-t เฉพาะเมื่อตรวจพบเทอร์มินัล นี่คือรหัสหลังจากการเปลี่ยนแปลง:

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.