أقوم بتشغيل الأمر التالي من Jenkinsfile
. ومع ذلك ، أحصل على الخطأ "جهاز الإدخال ليس TTY" .
docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
هل هناك طريقة لتشغيل البرنامج النصي من Jenkinsfile
دون القيام بالوضع التفاعلي؟
لديّ ملفًا يسمى script.sh
وأريد تشغيله داخل حاوية Docker.
أزل -it
من عميلك لجعله غير تفاعلي وأزل TTY. إذا كنت لا تحتاج أيضًا ، على سبيل المثال تشغيل الأمر الخاص بك داخل برنامج جنكينز أو cron ، يجب عليك القيام بذلك.
أو يمكنك تغييره إلى -i
إذا كنت قد دخلت مدخلات في أمر عامل ميناء لا يأتي من TTY. إذا كان لديك شيء مثل xyz | docker ...
أو docker ... <input
في سطر الأوامر ، فقم بذلك.
أو يمكنك تغييره إلى -t
إذا كنت تريد دعم TTY ولكن لا يتوفر لديك على جهاز الإدخال. قم بذلك من أجل التنسيق اللوني للإخراج في سجلاتك ، أو عندما تعلق لاحقًا على الحاوية باستخدام محطة مناسبة.
أو إذا كنت بحاجة إلى محطة تفاعلية ولم تكن تعمل في محطة طرفية على Linux أو MacOS ، فاستخدم واجهة سطر أوامر مختلفة. تم الإبلاغ عن PowerShell لتضمين هذا الدعم على Windows.
ما هو TTY؟ إنها واجهة طرفية تدعم إخراج اللون ، وتسلسلات الهروب ، وتحريك المؤشر ، وما إلى ذلك ، والتي تأتي من الأيام الخوالي من المحطات الغبية المرتبطة بالأجهزة المركزية. اليوم يتم توفيره بواسطة محطات أوامر Linux وواجهات ssh. راجع مقالة ويكيبيديا لمزيد من التفاصيل .
بالنسبة لأولئك الذين يكافحون مع هذا الخطأ و gash bash على Windows ، فقط استخدم PowerShell حيث يعمل -it
بشكل مثالي.
إذا كنت (مثلي) تستخدم git bash على النوافذ ، فأنت تحتاج فقط إلى وضعه
winpty
قبل "خط الإرساء":
winpty docker exec -it some_cassandra bash
أعتقد أنك بحاجة إلى أن تكون في TTY حتى يتمكن عامل النقل من تخصيص TTY (الخيار -t
). Jenkins ينفذ وظائفه لا في TTY.
بعد قولي هذا ، البرنامج النصي الذي تقوم بتشغيله داخل جنكينز قد ترغب أيضًا في تشغيله محليًا. في هذه الحالة ، قد يكون من المناسب حقًا تخصيص TTY حتى تتمكن من إرسال إشارات مثل ctrl+c عند تشغيله محليا.
لإصلاح ذلك ، اجعل البرنامج النصي يستخدم الخيار -t
اختياريًا ، مثل:
test -t 1 && USE_TTY="-t"
docker run ${USE_TTY} ...
إذا كنت تستخدم windows ، فجرب استخدام الأمر cmd. تحقق مما إذا كان عامل ميناء قد بدأ.
أعلم أن هذا لا يجيب بشكل مباشر على السؤال المطروح ولكن لأي شخص يأتي على هذا السؤال الذي يستخدم 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
يجب أن تكون قادرًا الآن على الاتصال بشكل تفاعلي مع جلسة عمل محطة طرفية.
winpty يعمل طالما لا تحدد وحدات التخزين المراد تثبيتها مثل ".:/mountpoint" أو "$ {pwd}:/mountpoint"
الحل الأفضل الذي وجدته هو استخدام البرنامج المساعد git-bash داخل Visual Code Studio واستخدام الجهاز لبدء وإيقاف الحاويات أو إنشاء عامل ميناء.