it-swarm.asia

خطأ "جهاز الإدخال ليس TTY"

أقوم بتشغيل الأمر التالي من Jenkinsfile. ومع ذلك ، أحصل على الخطأ "جهاز الإدخال ليس TTY" .

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

هل هناك طريقة لتشغيل البرنامج النصي من Jenkinsfile دون القيام بالوضع التفاعلي؟

لديّ ملفًا يسمى script.sh وأريد تشغيله داخل حاوية Docker.

246
Anthony

أزل -it من عميلك لجعله غير تفاعلي وأزل TTY. إذا كنت لا تحتاج أيضًا ، على سبيل المثال تشغيل الأمر الخاص بك داخل برنامج جنكينز أو cron ، يجب عليك القيام بذلك.

أو يمكنك تغييره إلى -i إذا كنت قد دخلت مدخلات في أمر عامل ميناء لا يأتي من TTY. إذا كان لديك شيء مثل xyz | docker ... أو docker ... <input في سطر الأوامر ، فقم بذلك.

أو يمكنك تغييره إلى -t إذا كنت تريد دعم TTY ولكن لا يتوفر لديك على جهاز الإدخال. قم بذلك من أجل التنسيق اللوني للإخراج في سجلاتك ، أو عندما تعلق لاحقًا على الحاوية باستخدام محطة مناسبة.

أو إذا كنت بحاجة إلى محطة تفاعلية ولم تكن تعمل في محطة طرفية على Linux أو MacOS ، فاستخدم واجهة سطر أوامر مختلفة. تم الإبلاغ عن PowerShell لتضمين هذا الدعم على Windows.


ما هو TTY؟ إنها واجهة طرفية تدعم إخراج اللون ، وتسلسلات الهروب ، وتحريك المؤشر ، وما إلى ذلك ، والتي تأتي من الأيام الخوالي من المحطات الغبية المرتبطة بالأجهزة المركزية. اليوم يتم توفيره بواسطة محطات أوامر Linux وواجهات ssh. راجع مقالة ويكيبيديا لمزيد من التفاصيل .

378
BMitch

بالنسبة لأولئك الذين يكافحون مع هذا الخطأ و gash bash على Windows ، فقط استخدم PowerShell حيث يعمل -it بشكل مثالي.

46
Piotr Justyna

إذا كنت (مثلي) تستخدم git bash على النوافذ ، فأنت تحتاج فقط إلى وضعه

winpty

قبل "خط الإرساء":

winpty docker exec -it some_cassandra bash
29
Gremi64

أعتقد أنك بحاجة إلى أن تكون في TTY حتى يتمكن عامل النقل من تخصيص TTY (الخيار -t). Jenkins ينفذ وظائفه لا في TTY.

بعد قولي هذا ، البرنامج النصي الذي تقوم بتشغيله داخل جنكينز قد ترغب أيضًا في تشغيله محليًا. في هذه الحالة ، قد يكون من المناسب حقًا تخصيص TTY حتى تتمكن من إرسال إشارات مثل ctrl+c عند تشغيله محليا.

لإصلاح ذلك ، اجعل البرنامج النصي يستخدم الخيار -t اختياريًا ، مثل:

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...
23
Gareth A. Lloyd

إذا كنت تستخدم windows ، فجرب استخدام الأمر cmd. تحقق مما إذا كان عامل ميناء قد بدأ.

3
Diego Santa Cruz Mendezú

أعلم أن هذا لا يجيب بشكل مباشر على السؤال المطروح ولكن لأي شخص يأتي على هذا السؤال الذي يستخدم WSL الذي يشغل Docker للنوافذ و cmder أو conemu.

الحيلة ليست استخدام Docker المثبت على windows في/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe ولكن لتثبيت Docker ubuntu/linux. تجدر الإشارة إلى أنه لا يمكنك تشغيل Docker نفسه من داخل WSL ولكن يمكنك الاتصال بـ Docker للنوافذ من عميل 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 for windows على المنفذ 2375 والذي يجب تمكينه من الإعدادات الموجودة في docker for 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

يجب أن تكون قادرًا الآن على الاتصال بشكل تفاعلي مع جلسة عمل محطة طرفية.

1
Damo

winpty يعمل طالما لا تحدد وحدات التخزين المراد تثبيتها مثل ".:/mountpoint" أو "$ {pwd}:/mountpoint"

الحل الأفضل الذي وجدته هو استخدام البرنامج المساعد git-bash داخل Visual Code Studio واستخدام الجهاز لبدء وإيقاف الحاويات أو إنشاء عامل ميناء.

1
Rusty1