Ошибка «Устройство ввода не TTY»


427

Я запускаю следующую команду от моего Jenkinsfile. Однако я получаю сообщение об ошибке «Устройство ввода не TTY» .

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

Есть ли способ запустить скрипт из Jenkinsfileбез интерактивного режима?

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


Для * nix, похоже, здесь нет решения. docker exec -i не работает и не работает -t.
Рюрни

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

@ Хатч Извините, я не могу вспомнить :(
Рюрни

Ответы:


641

Удалите -itиз вашего Cli, чтобы сделать его не интерактивным и удалите TTY. Если вам это не нужно, например, запустите команду внутри скрипта Jenkins или cron, вам следует это сделать.

Или вы можете изменить его, -iесли у вас есть входные данные, введенные в команду docker, которая не приходит из TTY. Если у вас есть что-то вроде xyz | docker ...или docker ... <inputв командной строке, сделайте это.

Или вы можете изменить его на, -tесли вы хотите поддержку TTY, но ее нет на устройстве ввода. Сделайте это для цветного форматирования вывода в ваших журналах или для последующего подключения к контейнеру с соответствующим терминалом.

Или, если вам нужен интерактивный терминал и вы не работаете в терминале в Linux или MacOS, используйте другой интерфейс командной строки. Сообщается, что PowerShell включает эту поддержку в Windows.


Что такое TTY? Это интерфейс терминала, который поддерживает вывод цвета, escape-последовательности, перемещение курсора и т. Д., Который пришел из старых времен тупых терминалов, прикрепленных к мэйнфреймам. Сегодня это обеспечивается командными терминалами Linux и интерфейсами ssh. Смотрите статью в Википедии для более подробной информации .


10
Я использую эту команду в сочетании с mysql -pбез указания пароля. При добавлении -iпароля подсказка никогда не появляется. При простом добавлении -tпоявляется подсказка, но кажется, что она вообще не читает ввод (который печатается буквально, а не скрывается подсказкой), даже при нажатии return; только Ctrl-C может закончить это. Можно ли каким-то образом использовать клиент MySQL с Docker таким образом?
ohcibi

95

Для тех, кто борется с этой ошибкой и git bash на Windows, просто используйте PowerShell, где -itработает отлично.


12
Это не отвечает на вопрос. Вопрос о докере в Jenkins, а не о git bash в Windows.

45
Хорошо. правда, и это никогда не было предназначено. Вопрос появляется в Google при поиске этого конкретного сообщения об ошибке. Я понял, что лучше где-то иметь ответ, чем вообще его не иметь. Очевидно, некоторые люди сочли это полезным :)
Петр Юстина

3
Проблема с Powershell в качестве TTY для операций оболочки заключается в том, что он не передает должным образом клавиши со стрелками, например, стрелку вверх для циклической истории команд. Прекрасно работает, кроме этого недостатка.
Corgalore

2
Если вы хотите продолжать использовать Git Bash, посмотрите этот ответ на другой вопрос или ответ winpty ниже
tessafyi

68

Это не совсем то, что вы спрашиваете, но:

Ключ -T бы помочь людям , которые используют докер-создание сообщения Exec!

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

2
именно то, что я искал. ты знаешь почему это работает?
Улад Касач

6
Как раз то, что мне тоже нужно. По справке: -T Отключить псевдо-tty распределение. По умолчанию docker-compose exec выделяется TTY.
TS

Спасибо чувак. Я ищу это для docker-compose!
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.

Сказав это, скрипт, который вы запускаете в Jenkins, вы также можете запускать локально. В этом случае может быть очень удобно выделить TTY, чтобы вы могли отправлять сигналы типа ctrl+ cпри локальном запуске.

Чтобы это исправить, сделайте ваш скрипт по выбору, используя -tопцию, например так:

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

Эта ошибка случается со мной при запуске docker run…команды из задачи make-файла, запускаемой с помощью git hook
Эдуард Лопес,

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», все работало хорошо.


Я тоже ударился головой о стену на пару часов с этими проблемами, используя bash. Перешел на Powershell и все работает сейчас!
Дэвид Спенард


1

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

Лучшее решение, которое я нашел, - это использовать плагин git-bash внутри Visual Code Studio и использовать терминал для запуска и остановки контейнеров или docker-compose.


1

Я знаю, что это не прямой ответ на данный вопрос, но для всех, кто сталкивается с этим вопросом, кто использует WSL с Docker для Windows и cmder или conemu.

Хитрость заключается не в том, чтобы использовать Docker, который установлен в Windows по адресу / mnt / c / Program Files / Docker / Docker / resources / bin / docker.exe, а в том, чтобы установить Docker для 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, который необходимо включить в настройках 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, которая, как я знаю, пытается выделить терминал, и завершается неудачей, если нет терминала для выделения.

В моем случае я изменил скрипт на параметр -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.