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

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

다음은 작동하는 명령입니다.

$ 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가 무엇을 의미하는지에 대한 역사적 개요, 그러나 여기서 어떤 종류의 계약을 위반했는지 이해하는 데 도움이 되지 않았습니다.

답변1

답변이 늦었지만 누군가에게 도움이 될 수 있습니다.

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

그래서

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

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

이제 "-t"의 경우 이는 입력이 터미널 장치임을 docker 내부의 기본 프로세스에 알려줍니다.

그래서

  • docker run -t alpine cat빈 줄이 표시되지만 "hello"를 입력하려고 하면 에코가 발생하지 않습니다. 이는 cat이 입력이 터미널 입력에 연결되어 있는 동안에는 입력에 연결되지 않기 때문입니다 . 귀하가 입력한 "hello"가 의 입력에 도달하지 못했습니다 cat. cat결코 도착하지 않는 입력을 기다리고 있습니다.
  • echo "hello" | docker run -t alpine cat또한 빈 줄을 제공하고 CTRL-D를 눌러 컨테이너를 종료하지 않지만 통과하지 못했기 때문에 "hello" 에코가 표시되지 않습니다.-i

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

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

마지막으로, 귀하의 입력을 의 입력 에 연결하는 트릭을 수행 -t한다면 왜 통과해야 합니까 ? 이는 터미널인 경우 명령이 입력을 다르게 처리하기 때문입니다. 이것은 또한 예를 통해 가장 잘 설명됩니다.-icat

  • docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -p비밀번호 프롬프트가 표시됩니다. 비밀번호를 입력하면 문자가 눈에 띄게 인쇄됩니다.
  • docker run -i alpine sh빈 줄을 줄 것입니다. 출력을 얻는 것과 같은 명령을 입력하면 ls프롬프트나 색상 출력이 나타나지 않습니다.

마지막 두 경우에서는 입력을 tty로 처리하지 않았을 mysql뿐만 아니라 입력을 마스킹하거나 출력에 색상을 지정하는 것과 같은 tty 특정 동작을 사용하지 않았기 때문에 이 동작이 발생합니다.shell

답변2

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

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

답변3

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

예제에 표시된 것처럼 명령을 docker에 파이프하면 echo해당 파이프가 입력이고 해당 파이프에는 tty 인터페이스가 없으며 단지 텍스트 스트림일 뿐입니다. 이를 사용하여 tty를 생성하려는 시도는 오류 메시지에 표시된 대로 실패합니다.

관련 정보