Ошибка "Устройство ввода не является 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.