오류 "입력 장치가 TTY가 아닙니다."
는 나의 다음명실다에서 .Jenkinsfile
그러나 "입력 장치가 TTY가 아닙니다."라는 오류가 발생합니다.
docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
에서 스크립트를 실행할 수 있는 방법이 있습니까?Jenkinsfile
대화형 모드를 수행하지 않고?
으로 기적으파이라는 있습니다.script.sh
도커 컨테이너 안에서 실행하고 싶습니다.
를 합니다.-it
대화형이 아닌 상태로 만들고 TTY를 제거합니다.Jenkins 또는 cron 스크립트 내에서 명령을 실행하는 등 필요하지 않은 경우 이 작업을 수행해야 합니다.
또는 다음으로 변경할 수 있습니다.-i
TTY에서 오지 않는 도커 명령에 파이프를 입력한 경우.만약 당신이 그런 것을 가지고 있다면.xyz | docker ...
또는docker ... <input
명령행에서 이 작업을 수행합니다.
또는 다음으로 변경할 수 있습니다.-t
TTY 지원을 원하지만 입력 장치에서 사용할 수 없는 경우.로그에서 출력의 색상 형식을 설정하기 위해 TTY를 확인하거나 나중에 적절한 터미널을 사용하여 컨테이너에 연결할 때 이 작업을 수행합니다.
또는 Linux 또는 MacOS에서 터미널에서 실행되지 않는 대화형 터미널이 필요한 경우 다른 명령줄 인터페이스를 사용합니다.PowerShell은 Windows에서 이 지원을 포함하는 것으로 보고되었습니다.
TTY란 무엇입니까?이것은 메인프레임에 부착된 옛날의 멍청한 터미널에서 나온 이스케이프 시퀀스, 커서 이동 등을 지원하는 터미널 인터페이스입니다.현재는 리눅스 명령 터미널과 ssh 인터페이스를 통해 제공됩니다.자세한 내용은 위키백과 기사를 참조하십시오.
TTY가 있는 컨테이너와 없는 컨테이너를 실행하는 방법의 차이를 확인하려면 TTY가 없는 컨테이너를 실행합니다.docker run --rm -i ubuntu bash
할 때 vim을 설치합니다.apt-get update; apt-get install vim
프롬프트가 표시되지 않습니다.파일에 대해 vim을 실행할 때는 파일 내에서 커서를 움직여 보십시오.
위해서docker run
하지 마십시오-it
(BMitch에서 언급한 바와 같이)
그리고 이것은 정확히 여러분이 요구하는 것은 아니지만, 다른 사람들에게도 유용할 것입니다.
위해서docker-compose exec
사용하다-T
깃발!
-T 키는 도커 합성 exec!을 사용하는 사람들에게 도움이 될 것입니다. (의사-tty 할당을 비활성화합니다.)
예:
docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup
또는
docker-compose exec -T mysql mysql -uuser_name -ppassword database_name < dir/to/db_backup.sql
이 에서 Gitbash를 사용하는 하면 됩니다.-it
완벽하게 작동합니다.
만약 당신이 창에서 깃배시를 사용하고 있다면, 당신은 단지 그것을 놓기만 하면 됩니다.
바람이 많은
'접두사 줄' 앞에:
winpty docker exec -it some_container bash
는 TTY("TTY")가합니다.-t
옵션) 도커 실행이 호출될 때 이미 TTY에 있어야 합니다.Jenkins는 TTY가 아닌 작업을 실행합니다.
Jenkins 내에서 실행 중인 스크립트도 로컬로 실행할 수 있습니다.이 경우 TTY를 로컬로 실행할 때 +와 c같은 신호를 보낼 수 있도록 TTY를 할당하는 것이 매우 편리할 수 있습니다.
합니다.-t
다음과 같은 옵션:
test -t 1 && USE_TTY="-t"
docker run ${USE_TTY} ...
'git bash'를 사용할 때,
다음 명령을 실행합니다.
docker exec -it 726fe4999627 /bin/bash
오류가 발생했습니다.
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
그런 다음 다음 명령을 실행합니다.
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
셋째, 다음을 실행합니다.
winpty docker exec -it 726fe4999627 bash
효과가 있었습니다.
powershell을 사용했을 때, 모든 것이 잘 작동했습니다.
Docker-compose exec -T를 사용하여 젠킨스를 통해 문제를 해결했습니다.
도커-compose exec -T containerName php 스크립트.php
동일한 경우 여기서 다음 명령을 실행하고 있습니다. slow .sh script(bash) 및 python.py 그러나 동일한 오류가 발생합니다. "입력 장치가 TTY가 아닙니다."
저의 경우, "운영" 환경의 실행 중인 컨테이너에서 인증을 사용하여 덤프를 가져오고 인수를 사용하여 전달한 다음 mssql 데이터베이스 컨테이너의 .bak 파일의 출력을 가져옵니다.
명령에서 -it를 제거합니다.대화형으로 유지하려면 -i를 유지합니다.
당신은 내 .sh 파일과 덤프를 가져오는 긴 명령을 확인할 수 있습니다.
Windows를 사용하는 경우 cmd를 사용해 보십시오. 저는 작동합니다.도커가 시작되었는지 확인합니다.
아래 표시된 Jenkins 파이프라인 단계가 동일한 오류로 실패했습니다.
steps {
echo 'Building ...'
sh 'sh ./Tools/build.sh'
}
내 "build.sh " 스크립트 파일에서 Jenkins 작업에 의해 실행되었을 때 이 오류가 출력됩니다.그러나 셸 터미널에서 스크립트가 실행되었을 때는 정상적으로 작동했습니다.docker run 명령어로 전달된 -t 옵션 때문에 오류가 발생했습니다. docker run 명령어는 단말기를 할당하려다가 할당할 단말기가 없으면 실패하는 것으로 알고 있습니다.
나의 경우 단말기가 감지될 수 있는 경우에만 스크립트를 pass -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
사하는대를 사용하는 에.-it
사용하다--tty
따라서 도커 실행은 다음과 같습니다.
docker run -v $PWD:/foobar --tty cloudfoundry/cflinuxfs2 /foobar/script.sh
저는 이것이 당면한 질문에 직접적으로 대답하는 것이 아니라 WSL을 실행하는 윈도우, cmder 또는 원뿔형 모듈을 사용하는 사람들을 위한 것이라는 것을 알고 있습니다.
요령은 /mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe의 Windows에 설치된 Docker를 사용하는 것이 아니라 Ubuntu/linux Docker를 설치하는 것입니다.WSL 내에서 Docker 자체를 실행할 수는 없지만 Linux Docker 클라이언트에서 Windows용 Docker에 연결할 수는 있습니다.
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
포트 2375의 창에 대한 도커에 연결합니다. 포트 2375의 창은 도커의 설정에서 활성화해야 합니다.
docker -H localhost:2375 run -it -v /mnt/c/code:/var/app -w "/var/app" centos:7
또는 -H 스위치를 생략할 수 있는 docker_host 변수를 설정합니다.
export DOCKER_HOST=tcp://localhost:2375
이제 tatty 터미널 세션과 대화형으로 연결할 수 있습니다.
젠킨스에서, 저는 도커-콤포지 exec-T를 사용하고 있습니다.
예:-
docker-compose exec -T app php artisan migrate
는 "windty"와 합니다..:/mountpoint
또는${pwd}:/mountpoint
가장 좋은 Studio 하고 터미널을 하여 Visual Code Studio를 및 입니다.containers
또는docker-compose
.
Pyinvoke를 사용하는 사용자는 링크가 끊길 경우 여기에서 신디케이트할 이 문서를 참조하십시오.
99%의 경우 실행 통화에 pty=True를 추가하면 예상대로 작동합니다.이 이유(및 pty=True가 기본값이 아닌 이유)를 계속 읽어 보십시오.
명령줄 프로그램은 제어 터미널의 존재 여부에 따라 동작을 변경하는 경우가 많습니다. 일반적인 예로는 색상이 지정된 출력을 사용하거나 사용하지 않는 경우가 있습니다.출력 수신자가 단말기의 사람인 경우 색상을 사용하거나 단말기 너비에 맞게 줄 길이를 조정하는 등의 작업을 수행할 수 있습니다.
반대로 출력이 다른 프로그램(쉘 파이프, CI 서버, 파일 등)으로 전송되는 경우 색상 이스케이프 코드 및 기타 터미널 관련 동작으로 인해 원하지 않는 가비지가 발생할 수 있습니다.
Invoke의 사용 사례는 위의 두 가지 모두에 걸쳐 있습니다. 때로는 데이터를 직접 표시하고 때로는 문자열로만 캡처하고 때로는 두 가지 모두를 원합니다.이것 때문에, 의사 터미널을 사용하는 "올바른" 기본 동작은 없습니다. 사용 사례의 일부 큰 덩어리는 어느 쪽이든 불편할 것입니다.
상관없는 사용 사례의 경우 의사 터미널 없이 직접 호출하는 것이 더 빠르고 깨끗하므로 기본값입니다.
제거하는 대신-t
스위치, 내 생각엔script -c 'a.sh' a.txt
더 좋을 것입니다.script
명령은 이 오류를 해결하는 pty 환경을 제공합니다.
script -c 'docker exec -it kblog df' a.txt
script -c 'docker exec -it kblog df' /dev/null
그script
명령어는 coreutils에 있을 수도 있고, 사용자가 busybox를 설치할 수도 있습니다. 이 명령어는 이것을 제공합니다.
내 블로그 게시물에도: https://kocdko.site/post/202307030023
-i 플래그를 -it 플래그보다 사용합니다.컨테이너 안에서 무슨 일이 일어나고 있는지 확인하는 데 도움이 될 수 있습니다.
docker exec -i $USER bash <<EOF
apt install nano -y
EOF
당신은 경고를 볼 수 있지만 그것은 도커 내부의 터미널에서 출력을 보여줍니다.
언급URL : https://stackoverflow.com/questions/43099116/error-the-input-device-is-not-a-tty
'programing' 카테고리의 다른 글
MariaDB to Zarr Array, 어떻게 해야 하나요? (0) | 2023.09.04 |
---|---|
변수에 필요한/변수로 변환 (0) | 2023.09.04 |
서블릿 필터에서 스프링 빈을 얻으려면 어떻게 해야 합니까? (0) | 2023.09.04 |
RStudio를 사용하여 MariaDB 원격 서버에 연결 (0) | 2023.09.04 |
선택한 라디오 버튼의 레이블에 대한 CSS 선택기 (0) | 2023.08.30 |