library - download docker image
Error "El dispositivo de entrada no es un TTY" (8)
Estoy ejecutando el siguiente comando desde mi
Jenkinsfile
.
Sin embargo,
aparece
el error
"El dispositivo de entrada no es un TTY"
.
docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
¿Hay alguna manera de ejecutar el script desde el
Jenkinsfile
sin hacer el modo interactivo?
Básicamente tengo un archivo llamado
script.sh
que me gustaría ejecutar dentro del contenedor Docker.
Creo que debe estar en un TTY para que Docker pueda asignar un TTY (la opción
-t
).
Jenkins ejecuta sus trabajos
no
en un TTY.
Dicho esto, el script que está ejecutando en Jenkins también puede querer ejecutarlo localmente. En ese caso, puede ser realmente conveniente tener un TTY asignado para que pueda enviar señales como ctrl + c cuando se ejecuta localmente.
Para solucionar esto, haga que su script use opcionalmente la opción
-t
, de esta manera:
test -t 1 && USE_TTY="-t"
docker run ${USE_TTY} ...
Elimine
-it
de su cli para que no sea interactivo y elimine el TTY.
Si tampoco lo necesita, por ejemplo, ejecutando su comando dentro de un script de Jenkins o cron, debe hacer esto.
O bien, puede cambiarlo a
-i
si tiene una entrada canalizada en el comando docker que no proviene de un TTY.
Si tienes algo como
xyz | docker ...
xyz | docker ...
o
docker ... <input
en su línea de comando, haga esto.
O puede cambiarlo a
-t
si desea soporte TTY pero no lo tiene disponible en el dispositivo de entrada.
Haga esto para formatear el color de la salida en sus registros, o para cuando luego lo conecte al contenedor con un terminal adecuado.
O si necesita un terminal interactivo y no se está ejecutando en un terminal en Linux o MacOS, use una interfaz de línea de comando diferente. Se informa que PowerShell incluye este soporte en Windows.
¿Qué es un TTY? Es una interfaz de terminal que admite salida de color, secuencias de escape, mover el cursor, etc., que proviene de los viejos tiempos de terminales tontos conectados a mainframes. Hoy lo proporcionan los terminales de comando de Linux y las interfaces ssh. Vea el artículo de Wikipedia para más detalles .
Para aquellos que luchan con este error y git bash en Windows, simplemente use PowerShell donde
-it
funciona perfectamente.
Sé que esto no está respondiendo directamente a la pregunta en cuestión, sino para cualquiera que se encuentre con esta pregunta y esté usando WSL ejecutando Docker para Windows y cmder o conemu.
El truco no es usar Docker, que está instalado en Windows en / mnt / c / Program Files / Docker / Docker / resources / bin / docker.exe, sino instalar ubuntu / linux Docker. Vale la pena señalar que no puede ejecutar Docker en sí mismo desde WSL, pero puede conectarse a Docker para Windows desde el cliente Linux Docker.
Instalar Docker en 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
Conéctese a Docker para Windows en el puerto 2375 que debe habilitarse desde la configuración de Docker para Windows.
docker -H localhost:2375 run -it -v /mnt/c/code:/var/app -w "/var/app" centos:7
O configure la variable docker_host que le permitirá omitir el modificador -H
export DOCKER_HOST=tcp://localhost:2375
Ahora debería poder conectarse interactivamente con una sesión de terminal tty.
Si está (como yo) usando git bash en windows, solo necesita poner
winpty
antes de su ''línea acoplable'':
winpty docker exec -it some_cassandra bash
cuando se usa ''git bash'',
1) ejecuto el comando:
docker exec -it 726fe4999627 /bin/bash
Tengo el error:
the input device is not a TTY. If you are using mintty, try prefixing the command with ''winpty''
2) luego, ejecuto el comando:
winpty docker exec -it 726fe4999627 /bin/bash
Tengo otro error:
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) tercero, ejecuto el:
winpty docker exec -it 726fe4999627 bash
funcionó.
cuando uso ''powershell'', todo funcionó bien.
si usa Windows, intente con cmd, para mí funciona. compruebe si se inicia la ventana acoplable.
winpty funciona siempre que no especifique volúmenes para montar como ".: / mountpoint" o "$ {pwd}: / mountpoint"
La mejor solución que he encontrado es usar el complemento git-bash dentro de Visual Code Studio y usar el terminal para iniciar y detener contenedores o componer acopladores.