“입력 장치가 TTY가 아닙니다”오류


425

내에서 다음 명령을 실행 중 Jenkinsfile입니다. 그러나 "입력 장치가 TTY가 아닙니다"라는 오류가 발생 합니다.

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

Jenkinsfile대화식 모드를 수행하지 않고 스크립트를 실행할 수있는 방법이 있습니까?

기본적으로 script.shDocker 컨테이너 내에서 실행하고 싶은 파일이 있습니다.


* nix의 경우 여기에 해결책이없는 것 같습니다. 'docker exec -i'가 작동하지 않거나 '-t'도 작동하지 않습니다.
rjurney

1
@rjurney docker exec에 대한 솔루션을 찾으셨습니까? 나는 성공하지 않고 -i와 -t를 시도했다. docker exec -it mycontainer bash certbot --apache -d www.website.com --email *********@gmail.com --agree-tos -n
Hutch

@ 허치 미안, 기억이 안나 :(
rjurney

답변:


639

-it클리닉에서을 제거하여 비 대화식으로 만들고 TTY를 제거하십시오. Jenkins 또는 cron 스크립트 내에서 명령을 실행하는 것과 같이 필요하지 않은 경우이 작업을 수행해야합니다.

또는 -iTTY에서 제공되지 않은 docker 명령으로 입력 파이프 된 경우로 변경할 수 있습니다 . 당신이 좋아하는 무언가가있는 경우 xyz | docker ...또는 docker ... <input명령 줄에서이 작업을 수행.

또는 -tTTY 지원을 원하지만 입력 장치에서 사용할 수없는 경우로 변경할 수 있습니다 . 로그 출력의 색상 형식을 지정하거나 나중에 적절한 터미널을 사용하여 컨테이너에 연결할 때이 작업을 수행하십시오.

또는 대화식 터미널이 필요하고 Linux 또는 MacOS의 터미널에서 실행되지 않는 경우 다른 명령 줄 인터페이스를 사용하십시오. PowerShell은 Windows에서이 지원을 포함하는 것으로보고되었습니다.


TTY 란 무엇입니까? 메인 프레임에 부착 된 낡은 멍청한 터미널에서 나오는 컬러 출력, 이스케이프 시퀀스, 커서 이동 등을 지원하는 터미널 인터페이스입니다. 현재는 Linux 명령 터미널과 ssh 인터페이스에서 제공됩니다. 자세한 내용은 Wikipedia 기사를 참조하십시오 .


10
mysql -p비밀번호를 지정하지 않고이 명령을 사용 하고 있습니다. -i비밀번호 프롬프트를 추가 할 때 절대 나타나지 않습니다. 단지 -t프롬프트를 추가 하면 나타 나지만 리턴을 칠 때조차도 입력 (프롬프트에 의해 숨겨지는 대신 문자 그대로 인쇄 됨)을 전혀 읽지 않는 것 같습니다. ctrl-c만이 끝날 수 있습니다. 어떻게 든 도커와 함께 mysql 클라이언트를 사용할 수 있습니까?
ohcibi

95

Windows 에서이 오류와 git bash로 어려움을 겪고있는 사람들에게는 PowerShell이 -it완벽하게 작동합니다.


12
이것은 질문에 대답하지 않습니다. 문제는 Windows의 git bash가 아닌 Jenkins의 docker에 관한 것입니다.

45
잘. 사실이며 결코 의도하지 않았습니다. 이 특정 오류 메시지를 검색하면 Google에 질문이 나타납니다. 나는 대답을 전혀 갖지 않는 것보다 어딘가에 대답하는 것이 낫다고 생각 했습니다. 분명히 어떤 사람들은 그것을 유용 :) 발견
표트르 저스티 나에게

3
쉘 작업의 TTY로서 Powershell의 문제점은 사이클링 명령 히스토리의 위쪽 화살표와 같이 화살표 키를 올바르게 전달하지 못한다는 것입니다. 그 단점 이외의 큰 효과가 있습니다.
Corgalore

2
Git Bash를 계속 사용하려면 아래의 다른 질문 또는 winpty 답변
tessafyi

67

정확히 당신이 요구하는 것은 아니지만 :

-T 키를 사용하는 사람들이 도움이 될 고정 표시기-작성 간부를!

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

2
정확히 내가 찾던 것. 왜 이것이 작동하는지 아십니까?
Ulad Kasach

6
나도 필요한 것 뿐이야 도움말에 따르면 : -T pseudo-tty 할당을 비활성화합니다. 기본적 docker-compose exec 으로 TTY가 할당됩니다.
TS

고마워요 docker-compose를 검색합니다!
ADyDyka

이것은 나를 위해 일했다!
rlorenzo

59

Windows에서 git bash를 사용하는 경우 (나처럼)

winpty

'docker line'앞 :

winpty docker exec -it some_cassandra bash

어떻게 다운로드 winpty합니까?
Mor Shemesh

6
묻기 전에 시도 했습니까? 나는 그것이 힘내와 함께 생각 (광산은 ... / Git / usr / bin)
Gremi64

당신 맞아요, 그것은 아래의C:\Program Files\Git\usr\bin\winpty.exe
모르 세메스

31

도 커가 TTY ( -t옵션) 를 할당 할 수 있으려면 TTY에 있어야한다고 생각합니다 . Jenkins 는 TTY가 아닌 작업을 실행합니다 .

젠킨스 내에서 실행중인 스크립트는 로컬에서 실행할 수도 있습니다. 이 경우 로컬로 실행할 때 ctrl+ 와 같은 신호를 보낼 수 있도록 TTY를 할당하는 것이 정말 편리 할 수 c있습니다.

이 문제를 해결하려면 스크립트 -t가 다음과 같이 옵션을 선택적으로 사용하십시오 .

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

이 오류 docker run…는 git hook에 의해 트리거되는 makefile 작업으로 명령을 실행할 때 발생합니다
Édouard Lopez

1
이것이 정답이어야합니다. 그것은 실제로 보편적으로 적용 가능한 방식으로 문제를 해결합니다
roothahn

11

'git bash'를 사용할 때

1) 나는 명령을 실행 :

docker exec -it 726fe4999627 /bin/bash

오류가 있습니다.

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

2) 그런 다음 명령을 실행합니다.

winpty docker exec -it 726fe4999627 /bin/bash

다른 오류가 있습니다.

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) 셋째, 나는 다음을 실행합니다.

winpty docker exec -it 726fe4999627 bash

효과가있었습니다.

'powershell'을 사용할 때 모두 잘 작동했습니다.


bash를 사용 하여이 문제로 몇 시간 동안 벽에 머리를 부딪 혔습니다. Powershell로 전환하여 모든 작업이 완료되었습니다!
David Spenard


1

". : / mountpoint"또는 "$ {pwd} : / mountpoint"와 같이 마운트 할 볼륨을 지정하지 않으면 winpty가 작동합니다.

내가 찾은 가장 좋은 해결 방법은 Visual Code Studio에서 git-bash 플러그인을 사용하고 터미널을 사용하여 컨테이너 또는 docker-compose를 시작하고 중지하는 것입니다.


1

나는 이것이 당면한 질문에 직접 대답하는 것이 아니라 Windows와 cmder 또는 conemu에 Docker를 실행하는 WSL을 사용하는이 질문에 나오는 모든 사람을 위해 알고 있습니다.

트릭은 / mnt / c / Program Files / Docker / Docker / resources / bin / docker.exe의 Windows에 설치된 Docker를 사용하는 것이 아니라 ubuntu / linux Docker를 설치하는 것입니다. WSL 내에서 Docker 자체를 실행할 수는 없지만 Linux Docker 클라이언트에서 Windows 용 Docker에 연결할 수 있음을 지적하는 것이 좋습니다.

Linux에 Docker 설치

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

Windows 용 docker의 설정에서 활성화해야하는 포트 2375의 Windows 용 Docker에 연결하십시오.

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

또는 docker_host 변수를 설정하면 -H 스위치를 생략 할 수 있습니다

export DOCKER_HOST=tcp://localhost:2375

이제 tty 터미널 세션과 대화식으로 연결할 수 있습니다.


0

아래에 표시된 내 Jenkins 파이프 라인 단계가 동일한 오류로 실패했습니다.

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

내 " build.sh "스크립트 파일 " docker run "명령에서 Jenkins 작업에 의해 실행될 때이 오류가 출력되었습니다. 그러나 스크립트가 쉘 터미널에서 실행될 때 정상적으로 작동했습니다 . -t 옵션으로 인해 docker run 명령에 전달되어 터미널을 할당하려고 시도하고 할당 할 터미널이 없으면 실패하는 오류가 발생했습니다.

필자의 경우 터미널을 감지 할 수있는 경우에만 스크립트를 -t 옵션으로 전달하도록 변경했습니다. 변경 후 코드는 다음과 같습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.