Ошибка "Устройство ввода не является TTY"

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

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

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

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

Ответ 1

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

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

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

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


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

Ответ 2

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

Ответ 3

Если вы (как я), используя git bash на окнах, вам просто нужно положить

winpty

перед вашей "докерной линией":

winpty docker exec -it some_cassandra bash

Ответ 4

Я считаю, что вам нужно быть в TTY для докеров, чтобы иметь возможность назначать TTY (опция -t). Дженкинс выполняет свои задания не в TTY.

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

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

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

Ответ 5

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

Клавиша -T поможет людям, использующим docker-compose exec!

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

Ответ 6

если вы используете окна, попробуйте с cmd, для меня это работает. проверьте, запущен ли докер.

Ответ 7

при использовании '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", все работало хорошо.

Ответ 8

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

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

Ответ 9

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

Хитрость заключается не в том, чтобы использовать Docker, который установлен в Windows по адресу /mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe, а в том, чтобы установить Docker для Ubuntu/Linux. Стоит отметить, что вы не можете запустить сам Docker из WSL, но вы можете подключиться к Docker для окон из клиента Linux Linux.

Установите 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.