Error "The input device is not a TTY"

DockerJenkinsJenkins Pipeline

Docker Problem Overview


I am running the following command from my Jenkinsfile. However, I get the error "The input device is not a TTY".

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

Is there a way to run the script from the Jenkinsfile without doing interactive mode?

I basically have a file called script.sh that I would like to run inside the Docker container.

Docker Solutions


Solution 1 - Docker

Remove the -it from your cli to make it non interactive and remove the TTY. If you don't need either, e.g. running your command inside of a Jenkins or cron script, you should do this.

Or you can change it to -i if you have input piped into the docker command that doesn't come from a TTY. If you have something like xyz | docker ... or docker ... <input in your command line, do this.

Or you can change it to -t if you want TTY support but don't have it available on the input device. Do this for apps that check for a TTY to enable color formatting of the output in your logs, or for when you later attach to the container with a proper terminal.

Or if you need an interactive terminal and aren't running in a terminal on Linux or MacOS, use a different command line interface. PowerShell is reported to include this support on Windows.


What is a TTY? It's a terminal interface that supports escape sequences, moving the cursor around, etc, that comes from the old days of dumb terminals attached to mainframes. Today it is provided by the Linux command terminals and ssh interfaces. See the wikipedia article for more details.

To see the difference of running a container with and without a TTY, run a container without one: docker run --rm -i ubuntu bash. From inside that container, install vim with apt-get update; apt-get install vim. Note the lack of a prompt. When running vim against a file, try to move the cursor around within the file.

Solution 2 - Docker

For docker run DON'T USE -it flag

(as said BMitch)

And it's not exactly what you are asking, but would be also useful for others:

For docker-compose exec use -T flag!

The -T key would help people who are using docker-compose exec! (It disable pseudo-tty allocation)

For example:

docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup

or

docker-compose exec -T mysql mysql -uuser_name -ppassword database_name < dir/to/db_backup.sql

Solution 3 - Docker

For those who struggle with this error and git bash on Windows, just use PowerShell where -it works perfectly.

Solution 4 - Docker

If you are (like me) using git bash on windows, you just need to put

> winpty

before your 'docker line' :

winpty docker exec -it some_cassandra bash

Solution 5 - Docker

In order for docker to allocate a TTY (the -t option) you already need to be in a TTY when docker run is called. Jenkins executes its jobs not in a TTY.

Having said that, the script you are running within Jenkins you may also want to run locally. In that case it can be really convenient to have a TTY allocated so you can send signals like ctrl+c when running it locally.

To fix this make your script optionally use the -t option, like so:

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...

Solution 6 - Docker

when using 'git bash',

  1. I execute the command:

    docker exec -it 726fe4999627 /bin/bash I have the error:

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

  2. then, I execute the command:

    winpty docker exec -it 726fe4999627 /bin/bash I have another 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
  1. third, I execute the:

    winpty docker exec -it 726fe4999627 bash it worked.

when I using 'powershell', all worked well.

Solution 7 - Docker

Using docker-compose exec -T fixed the problem for me via Jenkins

docker-compose exec -T containerName php script.php

Solution 8 - Docker

if using windows, try with cmd , for me it works. check if docker is started.

Solution 9 - Docker

My Jenkins pipeline step shown below failed with the same error.

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

In my "build.sh" script file "docker run" command output this error when it was executed by Jenkins job. However it was working OK when the script ran in the shell terminal.The error happened because of -t option passed to docker run command that as I know tries to allocate terminal and fails if there is no terminal to allocate.

In my case I have changed the script to pass -t option only if a terminal could be detected. Here is the code after changes :

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

Solution 10 - Docker

I know this is not directly answering the question at hand but for anyone that comes upon this question who is using WSL running Docker for windows and cmder or conemu.

The trick is not to use Docker which is installed on windows at /mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe but rather to install the ubuntu/linux Docker. It's worth pointing out that you can't run Docker itself from within WSL but you can connect to Docker for windows from the linux Docker client.

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

Connect to Docker for windows on the port 2375 which needs to be enabled from the settings in docker for windows.

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

Or set the docker_host variable which will allow you to omit the -H switch

export DOCKER_HOST=tcp://localhost:2375

You should now be able to connect interactively with a tty terminal session.

Solution 11 - Docker

In Jenkins, I'm using docker-compose exec -T

eg:-

docker-compose exec -T app php artisan migrate

Solution 12 - Docker

winpty works as long as you don't specify volumes to be mounted such as ".:/mountpoint" or "${pwd}:/mountpoint"

The best workaround I have found is to use the git-bash plugin inside Visual Code Studio and use the terminal to start and stop containers or docker-compose.

Solution 13 - Docker

For those using Pyinvoke see this documentation which I'll syndicate here in case the link dies:

> 99% of the time, adding pty=True to your run call will make things work as you were expecting. Read on for why this is (and why pty=True is not the default).

> Command-line programs often change behavior depending on whether a controlling terminal is present; a common example is the use or disuse of colored output. When the recipient of your output is a human at a terminal, you may want to use color, tailor line length to match terminal width, etc.

> Conversely, when your output is being sent to another program (shell pipe, CI server, file, etc) color escape codes and other terminal-specific behaviors can result in unwanted garbage.

> Invoke’s use cases span both of the above - sometimes you only want data displayed directly, sometimes you only want to capture it as a string; often you want both. Because of this, there is no “correct” default behavior re: use of a pseudo-terminal - some large chunk of use cases will be inconvenienced either way.

> For use cases which don’t care, direct invocation without a pseudo-terminal is faster & cleaner, so it is the default.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAnthonyView Question on Stackoverflow
Solution 1 - DockerBMitchView Answer on Stackoverflow
Solution 2 - DockeryestemaView Answer on Stackoverflow
Solution 3 - DockerPiotr JustynaView Answer on Stackoverflow
Solution 4 - DockerGremi64View Answer on Stackoverflow
Solution 5 - DockerGareth A. LloydView Answer on Stackoverflow
Solution 6 - DockerwangsirView Answer on Stackoverflow
Solution 7 - DockerSaiView Answer on Stackoverflow
Solution 8 - DockerDiego Santa Cruz MendezúView Answer on Stackoverflow
Solution 9 - DockerNamig HajiyevView Answer on Stackoverflow
Solution 10 - DockerDamoView Answer on Stackoverflow
Solution 11 - DockerWirat LeenavongananView Answer on Stackoverflow
Solution 12 - DockerRusty1View Answer on Stackoverflow
Solution 13 - DockerGreg HilstonView Answer on Stackoverflow