Błąd " urządzenie wejściowe nie jest TTY"

Uruchamiam następujące polecenie z mojego Jenkinsfile. Jednak dostaję błąd "Urządzenie wejściowe nie jest TTY".

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

Czy istnieje sposób na uruchomienie skryptu z Jenkinsfile bez wykonywania trybu interaktywnego?

Mam w zasadzie plik o nazwie script.sh, który chciałbym uruchomić wewnątrz kontenera dokera.

Author: Peter Mortensen, 2017-03-29

11 answers

Usuń -it ze swojego cli, aby nie był interaktywny i usuń TTY. Jeśli nie potrzebujesz żadnego z nich, np. uruchomienia komendy wewnątrz skryptu Jenkins lub cron, powinieneś to zrobić.

Lub możesz zmienić go na -i, jeśli wprowadziłeś polecenie Docker, które nie pochodzi z TTY. Jeśli masz coś w rodzaju xyz | docker ... lub docker ... <input w linii poleceń, zrób to.

Lub możesz zmienić ją na -t, Jeśli chcesz obsługiwać TTY, ale nie masz jej dostępnej na urządzeniu wejściowym. Zrób to dla aplikacji, które sprawdzają, czy TTY umożliwia formatowanie kolorów wyjścia w dziennikach, lub gdy później dołączysz do kontenera za pomocą odpowiedniego terminala.

Lub jeśli potrzebujesz interaktywnego terminala, a nie działasz w terminalu na Linuksie lub MacOS, użyj innego interfejsu wiersza poleceń. Program PowerShell ma tę obsługę w systemie Windows.


Co to jest TTY? Jest to interfejs terminala obsługujący sekwencje escape, przesuwanie kursora itp. z dawnych czasów głupich terminali dołączonych do mainframe ' ów. Obecnie jest on dostarczany przez terminale poleceń Linuksa i interfejsy ssh. Zobacz artykuł wikipedia, aby uzyskać więcej szczegółów .

Aby zobaczyć różnicę w pracy kontenera z i bez TTY, Uruchom kontener bez niego: docker run --rm -i ubuntu bash. Z wnętrza tego kontenera zainstaluj Vima za pomocą apt-get update; apt-get install vim. Zwróć uwagę na brak zachęty. Podczas uruchamiania Vima na pliku spróbuj przesunąć kursor w obrębie pliku.

 794
Author: BMitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-25 15:38:21

Dla tych, którzy zmagają się z tym błędem i git bash na Windows, po prostu użyj PowerShell gdzie -it działa idealnie.

 115
Author: Piotr Justyna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-24 19:19:27

To nie jest dokładnie to, o co prosisz, ale:

Klucz -Tpomoże ludziom, którzy używają docker-compose exec!

docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup
 109
Author: yestema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-19 23:44:12

Jeśli używasz (tak jak ja) git Basha na windows, musisz tylko umieścić

Winpty

Przed 'docker line':

winpty docker exec -it some_cassandra bash
 66
Author: Gremi64,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-23 08:52:30

Uważam, że musisz być w TTY, aby docker mógł przydzielić TTY(opcja -t). Jenkins wykonuje swoje zadania , a nie W TTY.

Mimo tego, skrypt, który uruchamiasz w Jenkins, możesz również chcieć uruchomić lokalnie. W takim przypadku może być naprawdę wygodne, aby mieć przypisany TTY, dzięki czemu można wysyłać sygnały takie jak ctrl+c podczas uruchamiania go lokalnie.

Aby to naprawić, użyj opcji -t w następujący sposób:

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...
 35
Author: Gareth A. Lloyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-12 16:15:44

Podczas używania 'Git bash',

1) wykonuję polecenie:

docker exec -it 726fe4999627 /bin/bash

Mam błąd:

the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

2) następnie wykonuję polecenie:

winpty docker exec -it 726fe4999627 /bin/bash

Mam inny błąd:

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) Po trzecie wykonuję:

winpty docker exec -it 726fe4999627 bash
Zadziałało.

Kiedy używałem 'powershell', wszystko działało dobrze.

 14
Author: wangsir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-07 13:55:32

Użycie docker-compose exec-T naprawiło problem przez Jenkins

Docker-compose Exec-t containerName PHP script.php

 5
Author: Sai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-10 22:54:11

Jeśli używasz windows, spróbuj z cmd , dla mnie działa. sprawdź, czy docker jest uruchomiony.

 4
Author: Diego Santa Cruz Mendezú,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-25 02:18:42

Winpty działa tak długo, jak długo nie określisz woluminów do zamontowania, takich jak ".w tym celu należy wykonać następujące czynności:]}

Najlepszym obejściem, jakie znalazłem, jest użycie wtyczki git-bash wewnątrz Visual Code Studio i użycie terminala do uruchamiania i zatrzymywania kontenerów lub komponowania Dockera.

 0
Author: Rusty1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-07 09:53:36

Wiem, że to nie jest bezpośrednio odpowiedź na pytanie pod ręką, ale dla każdego, kto przychodzi na to pytanie, kto używa WSL uruchomiony Docker dla windows i cmder lub conemu.

Sztuką jest nie używać Dockera, który jest zainstalowany w systemie windows w /mnt/C/Program Files/Docker/Docker/resources/bin/Docker.exe, ale raczej zainstalować Docker ubuntu / linux. Warto zaznaczyć, że nie można uruchomić samego Dockera z poziomu WSL, ale można połączyć się z Dockerem Dla windows z poziomu Linux Docker klient.

Install Docker on 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

Połącz się z Docker for windows na porcie 2375, który musi być włączony z poziomu ustawień w docker for windows.

docker -H localhost:2375 run -it -v /mnt/c/code:/var/app -w "/var/app" centos:7

Lub ustawić zmienną docker_host, która pozwoli na pominięcie przełącznika-H

export DOCKER_HOST=tcp://localhost:2375

Powinieneś teraz mieć możliwość interaktywnego łączenia się z sesją terminala tty.

 0
Author: Damo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-26 10:20:24

Mój pokazany poniżej Krok potoku Jenkins nie powiódł się z tym samym błędem.

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

W moim " build.sh "plik skryptu"docker run" polecenie wyświetla ten błąd, gdy zostało wykonane przez Jenkins job. Jednak to dziaĹ ' aĹ 'o OK, gdy skrypt uruchomiĺ' siÄ ™ w terminalu powĺ ' OKI.Błąd wystąpił z powodu opcji -t przekazanej do docker run polecenie, które, jak wiem, próbuje przydzielić terminal i nie powiedzie się, jeśli nie ma terminala do przydzielić.

W mój przypadek zmieniłem skrypt na opcję pass - t tylko wtedy, gdy można wykryć terminal. Oto kod po zmianach:

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
 0
Author: Namik Hajiyev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-30 08:51:18