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
modo interactivo?
Básicamente tengo un archivo llamado script.sh
que me gustaría ejecutar dentro del contenedor Docker.
docker
jenkins
jenkins-pipeline
Antonio
fuente
fuente
Respuestas:
Elimine el
-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 puede cambiarlo a
-i
si ha ingresado una entrada al comando del acoplador que no proviene de un TTY. Si tiene algo comoxyz | docker ...
odocker ... <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 .
fuente
mysql -p
sin especificar una contraseña. Cuando solo agrega-i
la solicitud de contraseña, nunca aparece. Con solo agregar,-t
aparece el mensaje, pero parece no leer la entrada (que se imprime literalmente en lugar de estar oculto por el mensaje) en absoluto, ni siquiera cuando se presiona volver; solo ctrl-c puede terminarlo. ¿De alguna manera es posible usar el cliente mysql con docker de esa manera?Para aquellos que luchan con este error y git bash en Windows, solo usen PowerShell donde
-it
funciona perfectamente.fuente
No es exactamente lo que estás preguntando, pero:
¡La tecla -T ayudaría a las personas que usan docker-compose exec!
fuente
docker-compose exec
asigna un TTY.Si está (como yo) usando git bash en windows, solo necesita poner
antes de su 'línea acoplable':
fuente
winpty
?C:\Program Files\Git\usr\bin\winpty.exe
Creo que debe estar en un TTY para que Docker pueda asignar un TTY (la
-t
opción). Jenkins ejecuta sus trabajos no en un TTY.Dicho esto, el script que está ejecutando dentro de 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+ ccuando se ejecuta localmente.
Para solucionar esto, haga que su secuencia de comandos utilice opcionalmente la
-t
opción, así:fuente
docker run…
comando desde una tarea de archivo desencadenada por un gancho de gitcuando se usa 'git bash',
1) ejecuto el comando:
Tengo el error:
2) luego, ejecuto el comando:
Tengo otro error:
3) tercero, ejecuto el:
funcionó.
cuando uso 'powershell', todo funcionó bien.
fuente
si usa Windows, intente con cmd, para mí funciona. compruebe si se inicia la ventana acoplable.
fuente
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.
fuente
Sé que esto no está respondiendo directamente 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
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.
fuente
Mi paso de canalización Jenkins que se muestra a continuación falló con el mismo error.
En mi archivo de comandos " build.sh ", el comando " docker run " genera este error cuando fue ejecutado por el trabajo de Jenkins. Sin embargo, estaba funcionando bien cuando el script se ejecutó en el terminal de shell. El error ocurrió debido a que la opción -t pasó al comando docker run que, como sé, intenta asignar el terminal y falla si no hay un terminal para asignar.
En mi caso, he cambiado el script para pasar la opción -t solo si se pudo detectar un terminal. Aquí está el código después de los cambios:
fuente