"입력 장치가 TTY가 아닙니다"는 "docker run"출력에서 정확히 무엇을 의미합니까?


18

이것은 작동하는 명령입니다.

$ echo 'hi there' | docker run -i ubuntu cat
hi there

이것은 오류 메시지로 응답하는 명령입니다.

$ echo 'hi there' | docker run -it ubuntu cat
the input device is not a TTY

여기서 무슨 일이 일어나는지 정확히 알고 싶습니다. "-t를 제거하면 해결됩니다".

내가 알고 docker run-t옵션은 "의사 TTY을 할당"의 약자, 내가 읽고 TTY가 무엇의 약자인지의 역사적 개요를 하지만 나에게 일종의 계약 여기에 위반 이해 도움이되지 않았다.


중복이 아니며, docker는 아무것도 부착하지 않고도 TTY를 만들 수 있습니다. 출력에는 색상 등의 문자가 있지만 터미널 출력은 컨테이너의 입력으로 파이프되지 않습니다. 따라서 입력 한 문자는 docker 명령이 종료 된 후 다음에 실행할 명령에 대해 대기합니다.
BMitch

도커 내에서 tty를 시작할 수 있습니까? 작동하지 않는 앱이 있습니다. 도커를 실행하지 않지만 -t프로덕션에서 docker start 명령을 수정할 수 없습니다. 따라서 앱이로 시작되었다고 생각하도록해야합니다 -t.
mvorisek 2016 년

답변:


9

이 대답 은 내 머리를 감싸는 데 도움 되었습니다.

  • Docker 컨테이너는 기본적으로 ( 옵션 도 -i없고) -t옵션을 STDOUT으로 보냅니다.
  • -i옵션은 STDIN에 대한 연결을 제공,
  • -t옵션 은 STDIN / STDOUT 위에서 작동 하는 터미널 인터페이스 드라이버를 가져옵니다 . 그리고 터미널 드라이버를 가져 오면 컨테이너와의 통신은 터미널 인터페이스 프로토콜을 준수해야 합니다 . 문자열을 파이핑하지 않습니다.

7

늦은 답변이지만 누군가를 도울 수 있습니다

docker run/exec -i컨테이너 내부의 명령의 STDIN을 docker run/exec자체 의 STDIN에 연결 합니다.

그래서

  • docker run -i alpine cat입력을 기다리는 빈 줄을 제공합니다. "hello"를 입력하면 에코 "hello"가 나타납니다. 기본 프로세스 cat가의 터미널 입력 인 무한 스트림의 입력을 기다리고 있으므로 CTRL + D를 보낼 때까지 컨테이너가 종료되지 않습니다 docker run.
  • 반면에 echo "hello" | docker -i run alpine cat"hello"를 인쇄 cat하고 입력 스트림이 종료되었다는 것을 알기 때문에 즉시 종료됩니다.

docker ps위 중 하나를 종료 한 후에 시도 하면 실행중인 컨테이너가 없습니다. 두 경우 모두 cat자체가 종료되었으므로 docker가 컨테이너를 종료했습니다.

이제 "-t"의 경우, docker 내부의 주요 프로세스에 입력이 터미널 장치임을 알립니다.

그래서

  • docker run -t alpine cat빈 줄을 줄 것입니다. 그러나 "hello"를 입력하면 에코가 나타나지 않습니다. while cat이 터미널 입력에 연결되어 있기 때문에이 입력이 입력에 연결되지 않았기 때문 입니다. 입력하신 "hello"가에 입력되지 않았습니다 cat. cat도착하지 않는 입력을 기다리고 있습니다.
  • echo "hello" | docker run -t alpine cat 또한 빈 줄을 제공하고 CTRL-D에서 컨테이너를 종료하지 않지만 통과하지 않았기 때문에 에코 "hello"를 얻지 못합니다. -i

CTRL + C를 보내면 셸을 다시 가져 오지만 docker ps지금 시도 하면 cat컨테이너가 여전히 실행중인 것을 볼 수 있습니다 . cat닫히지 않은 입력 스트림을 계속 기다리고 있기 때문 입니다. -t와 결합하지 않고 단독으로 유용한 용도를 찾지 못했습니다 -i.

이제 -it함께. 이것은 cat에게 입력이 터미널이라는 것을 알려주고 동시에 터미널을 입력에 연결합니다 docker run. docker run/exec전달하기 전에 자체 입력이 실제로 tty인지 확인합니다 cat. 이 경우에 입력 자체 가 실행되는 터미널이 아닌 이전 에코의 파이프 이기 때문에 input device is not a TTY시도 하면 결과가 표시됩니다.echo "hello" | docker run -it alpine catdocker rundocker run

마지막으로, 당신은 왜 전달해야 할 -t경우 -i에 입력을 연결하는 트릭을 할 것 cat'의 입력을? 명령이 입력 인 경우 명령이 입력을 다르게 취급하기 때문입니다. 이것은 또한 예제로 가장 잘 설명됩니다.

  • docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -p암호 프롬프트가 나타납니다. 암호를 입력하면 문자가 표시됩니다.
  • docker run -i alpine sh빈 줄을 줄 것입니다. ls출력 과 같은 명령을 입력하면 프롬프트 나 컬러 출력이 표시되지 않습니다.

마지막 두 경우에, 당신은 때문에이 동작을 얻을 mysql뿐만 아니라 같이 shell입력을 마스킹하거나 출력을 착색처럼 TTY 특정 동작을 사용하지 않은, 따라서 청각 장애로 입력을 처리되지 않은합니다.


4

tty는 xterm 또는 많은 Linux 명령 행 인터페이스 중 하나에서 제공되는 터미널이 있음을 나타냅니다. 키보드와 관련된 텍스트 출력 인터페이스가 필요합니다. 일반적인 이유는 컬러 텍스트 출력 지원, 화살표 키와 같은 다양한 키 조합 처리 및 커서를 화면 주위로 이동하는 기능 때문입니다.

echo예제 와 같이 명령을 docker로 파이프하면 파이프가 입력이며 파이프에 tty 인터페이스가 없으며 텍스트 스트림 일뿐입니다. 오류 메시지가 나타내는대로 tty를 작성하려고 시도하면 실패합니다.



"키보드와 출력 인터페이스"와 "STDIN / STDOUT"사이에는 여전히 차이가 있습니다. STDOUT은 화면이 아닌 스트림이므로 분명히 "커서 위치"개념을 STDOUT에 적용 할 수 없습니다. STDOUT 위에있는 출력 인터페이스 추상화를 설명하는 사양은 무엇입니까?
Mikhail Vasin

1
stdin / stdout 위에서 실행되는 인터페이스입니다. en.wikipedia.org/wiki/POSIX_terminal_interface
BMitch 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.