Korzystam z następującego polecenia z mojego Jenkinsfile
. Jednak pojawia się błąd „Urządzenie wejściowe nie jest urządzeniem TTY” .
docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
Czy istnieje sposób na uruchomienie skryptu z Jenkinsfile
pominięciem trybu interaktywnego?
Zasadniczo mam plik o nazwie script.sh
, który chciałbym uruchomić w kontenerze Docker.
docker
jenkins
jenkins-pipeline
Anthony
źródło
źródło
Odpowiedzi:
Usuń
-it
z cli, aby nie było interaktywne i usuń TTY. Jeśli nie potrzebujesz, np. Uruchamiając polecenia w skrypcie Jenkins lub cron, powinieneś to zrobić.Możesz też zmienić to na,
-i
jeśli wprowadziłeś potok do polecenia dokera, które nie pochodzi z TTY. Jeśli masz coś podobnegoxyz | docker ...
lubdocker ... <input
w wierszu poleceń, zrób to.Możesz też zmienić na,
-t
jeśli chcesz obsługiwać TTY, ale nie masz go na urządzeniu wejściowym. Zrób to, aby sformatować kolory danych wyjściowych w dziennikach lub gdy później przymocujesz do kontenera za pomocą odpowiedniego terminala.Lub jeśli potrzebujesz terminalu interaktywnego i nie pracujesz w terminalu w systemie Linux lub MacOS, użyj innego interfejsu wiersza polecenia. Zgłoszono, że PowerShell zawiera tę obsługę w systemie Windows.
Co to jest TTY? Jest to interfejs terminala, który obsługuje wyjście kolorów, sekwencje specjalne, przesuwanie kursora itp., Który pochodzi z dawnych czasów głupich terminali podłączonych do komputerów mainframe. Dzisiaj są dostarczane przez terminale poleceń Linux i interfejsy ssh. Aby uzyskać więcej informacji, zobacz artykuł w Wikipedii .
źródło
mysql -p
bez podawania hasła. Po prostu dodanie-i
hasła nigdy nie pojawia się. Po dodaniu-t
monitu pojawia się monit, ale wydaje się, że w ogóle nie odczytuje danych wejściowych (które są drukowane dosłownie, zamiast być ukryte przez monit), nawet po naciśnięciu klawisza return; tylko ctrl-c może to zakończyć. Czy w jakiś sposób można w ten sposób używać klienta mysql z dokerem?Dla tych, którzy zmagają się z tym błędem i git bash w Windows, wystarczy użyć PowerShell, gdzie
-it
działa idealnie.źródło
Nie jest to dokładnie to, o co prosisz, ale:
Klawisz -T pomógłby osobom korzystającym z docker-compose exec!
źródło
docker-compose exec
przydziela TTY.Jeśli (podobnie jak ja) używasz git bash w systemie Windows, wystarczy umieścić
przed „linią dokującą”:
źródło
winpty
?C:\Program Files\Git\usr\bin\winpty.exe
Uważam, że musisz być w TTY, aby doker mógł przydzielić TTY (
-t
opcja). Jenkins wykonuje swoje zadania nie w TTY.Powiedziawszy to, skrypt, który uruchamiasz w Jenkins, możesz również chcieć uruchomić lokalnie. W takim przypadku przydzielenie TTY może być bardzo wygodne, aby można było wysyłać sygnały takie jak ctrl+ cpodczas lokalnego uruchamiania.
Aby to naprawić, opcjonalnie użyj skryptu
-t
:źródło
docker run…
polecenia z zadania makefile wyzwalanego przez haczykpodczas korzystania z „git bash”,
1) Wykonuję polecenie:
Mam błąd:
2) następnie wykonuję polecenie:
Mam inny błąd:
3) po trzecie, wykonuję:
zadziałało.
kiedy używam „PowerShell”, wszystko działało dobrze.
źródło
jeśli używasz Windowsa, wypróbuj cmd, dla mnie to działa. sprawdź, czy doker jest uruchomiony.
źródło
winpty działa, o ile nie określisz woluminów do zamontowania, takich jak „.: / mountpoint” lub „$ {pwd}: / mountpoint”
Najlepszym obejściem, jakie znalazłem, jest użycie wtyczki git-bash w Visual Code Studio i użycie terminala do uruchamiania i zatrzymywania kontenerów lub tworzenia dokerów.
źródło
Wiem, że nie jest to bezpośrednia odpowiedź na pytanie, ale dla każdego, kto przyjdzie na to pytanie, kto używa WSL z uruchomionym Dockerem dla Windows i cmder lub conemu.
Sztuką nie jest używanie Dockera, który jest instalowany w systemie Windows w / mnt / c / Program Files / Docker / Docker / resources / bin / docker.exe, ale raczej instalowanie Dockera ubuntu / linux. Warto zauważyć, że nie można uruchomić Dockera bezpośrednio z poziomu WSL, ale można połączyć się z Dockerem dla Windows z klienta Linux Docker.
Zainstaluj Docker w systemie Linux
Połącz się z Dockerem dla Windows na porcie 2375, który należy włączyć w ustawieniach okna dokowanego dla Windows.
docker -H localhost:2375 run -it -v /mnt/c/code:/var/app -w "/var/app" centos:7
Lub ustaw zmienną docker_host, która pozwoli ci pominąć przełącznik -H
export DOCKER_HOST=tcp://localhost:2375
Powinieneś być teraz w stanie łączyć się interaktywnie z sesją terminala tty.
źródło
Mój krok potoku Jenkins pokazany poniżej nie powiódł się z tym samym błędem.
W moim „ build.sh ” skrypt „ run doker ” wyjście polecenia ten błąd, kiedy została ona wykonana przez Jenkins pracy. Jednak działało OK, gdy skrypt działał w terminalu powłoki. Błąd wystąpił z powodu opcji -t przekazanej do komendy uruchamiania dokera, która jak wiem próbuje przydzielić terminal i kończy się niepowodzeniem, jeśli nie ma alokacji terminala.
W moim przypadku zmieniłem skrypt na opcję -t tylko wtedy, gdy można było wykryć terminal. Oto kod po zmianach:
źródło