Помилка "Пристрій вводу не TTY"


425

Я виконую наступну команду з мого Jenkinsfile. Однак я отримую помилку "Пристрій введення не TTY" .

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

Чи є спосіб запустити скрипт з Jenkinsfileінтерактивного режиму?

У мене в основному є файл під назвою, script.shякий я хотів би запустити всередині контейнера Docker.


Для * nix, схоже, тут немає рішення. 'docker exec -i' не працює, ні '-t'.
rjurney

1
@rjurney Ви коли-небудь знаходили рішення для docker exec? Я спробував -i та -t не мав успіху. docker exec - це mycontainer bash certbot --apache -d www.website.com --email *********@gmail.com --agree-tos -n
Хатч

@ Хатч Вибачте, не можу згадати :(
rjurney

Відповіді:


639

Видаліть -itзі свого кліпу, щоб зробити його не інтерактивним та видаліть TTY. Якщо вам це не потрібно, наприклад, виконайте свою команду всередині сценарію Дженкінса або cron, вам слід це зробити.

Або ви можете змінити його, -iякщо ви ввели вкладений в команду докер, який не надходить з TTY. Якщо у вас є щось на кшталт xyz | docker ...або docker ... <inputу вашому командному рядку, зробіть це.

Або ви можете змінити його, -tякщо ви хочете підтримати TTY, але не маєте його на пристрої введення. Зробіть це для кольорового форматування виводу у ваших журналах або для того, коли згодом ви додасте до контейнера відповідний термінал.

Або якщо вам потрібен інтерактивний термінал і не працює в терміналі на Linux або MacOS, використовуйте інший інтерфейс командного рядка. Повідомляється, що PowerShell включає цю підтримку в Windows.


Що таке TTY? Це термінальний інтерфейс, який підтримує вихід кольорів, послідовності виходу, переміщення курсору навколо тощо, що походить від старих часів тупих терміналів, прикріплених до мейнфреймів. Сьогодні це забезпечується командними терміналами Linux та інтерфейсами ssh. Докладніше див. У статті Вікіпедії .


10
Я використовую цю команду спільно з mysql -pне вказуючи пароль. При простому додаванні -iзапит на пароль ніколи не з’являється. Щойно додавання -tпідсказки з'являється, але, здається, не читає вхід (який друкується буквально замість того, щоб приховувати підказку) взагалі, навіть при натисканні на повернення; лише ctrl-c може закінчити це. Чи можна якось таким чином використовувати клієнт mysql з docker?
ohcibi

95

Для тих, хто бореться з цією помилкою та git bash у Windows, просто використовуйте PowerShell, де -itпрацює чудово.


12
Це не дає відповіді на запитання. Питання стосується докера в Дженкінсі, а не git bash для Windows.

45
Добре. правда, і цього ніколи не передбачалося. Під час пошуку цього конкретного повідомлення про помилку в Google з’являється запитання. Я подумав, краще відповісти десь, ніж не мати її взагалі. Очевидно, що деякі люди вважають це корисним :)
Piotr Justyna

3
Проблема з Powershell як TTY для операцій з оболонкою полягає в тому, що він не передає належним чином клавіші зі стрілками, як стрілка вгору для історії циклічних команд. Чудово працює, крім цього недоліку.
Коргалоре

2
Якщо ви хочете продовжувати використовувати Git Bash, дивіться цю відповідь на інше запитання або вічну відповідь нижче
tessafyi

67

Ви не просто запитуєте, але:

Ключ -T б допомогти людям , які використовують докер-створення повідомлення Exec!

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

2
саме те, що я шукав. ти знаєш, чому це працює?
Улад Касач

6
Тільки те, що мені теж було потрібно. Відповідно до довідки: -T Вимкнення виділення псевдо-tty. За замовчуванням docker-compose exec виділяє TTY.
TS

Спасибі людина. Я шукаю його докер-композитом!
ADyDyka

Це працювало для мене!
рлоренцо

59

Якщо ви (як я) використовуєте git bash на windows, вам просто потрібно поставити

winpty

перед вашою "докерною лінією":

winpty docker exec -it some_cassandra bash

як ви завантажуєте winpty?
Мор Шемеш

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
É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

це спрацювало.

коли я використовував 'powerhell', все працювало добре.


Я також вдарив мою голову об стіну протягом кількох годин із цими проблемами, використовуючи bash. Підключено до Powershell і все працює зараз!
Девід


1

winpty працює до тих пір, поки ви не вкажете томи, які потрібно монтувати, наприклад ".: / mountpoint" або "$ {pwd}: / mountpoint"

Найкращий спосіб, який я знайшов, - це використовувати плагін git-bash всередині Visual Code Studio і використовувати термінал для запуску і зупинки контейнерів або докер-компонування.


1

Я знаю, що це не відповідає безпосередньо на відповідне питання, але для тих, хто стикається з цим питанням, хто використовує WSL під керуванням Docker для windows та cmder або conemu.

Трюк не в тому, щоб використовувати Docker, який встановлюється на Windows за адресою / mnt / c / Файли програми / Docker / Docker / ресурси / bin / docker.exe, а не встановлювати Dobu ubuntu / linux. Варто зазначити, що ви не можете запустити сам 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, який потрібно ввімкнути за допомогою параметрів у докері для 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

Показаний нижче крок трубопроводу Дженкінса не вдався з тією ж помилкою.

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

У моєму сценарії " build.sh " файл " docker run " виводить цю помилку, коли вона виконувалась завданням Jenkins. Однак він працював нормально, коли сценарій запускався в терміналі оболонки. Помилка сталася через те, що опція -t передана команді запуску докера, яка, як я знаю, намагається виділити термінал і не вдається, якщо терміналу не виділити.

У моєму випадку я змінив сценарій на параметр 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.