이것은 작동하는 명령입니다.
$ 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 컨테이너는 기본적으로 ( 옵션 도
-i
없고)-t
옵션을 STDOUT으로 보냅니다. - 와
-i
옵션은 STDIN에 대한 연결을 제공, -t
옵션 은 STDIN / STDOUT 위에서 작동 하는 터미널 인터페이스 드라이버를 가져옵니다 . 그리고 터미널 드라이버를 가져 오면 컨테이너와의 통신은 터미널 인터페이스 프로토콜을 준수해야 합니다 . 문자열을 파이핑하지 않습니다.
답변
늦은 답변이지만 누군가를 도울 수 있습니다
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”를 입력하면 에코가 나타나지 않습니다. whilecat
이 터미널 입력에 연결되어 있기 때문에이 입력이 입력에 연결되지 않았기 때문 입니다. 입력하신 “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 cat
docker run
docker 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 특정 동작을 사용하지 않은, 따라서 청각 장애로 입력을 처리되지 않은합니다.
답변
tty는 xterm 또는 많은 Linux 명령 행 인터페이스 중 하나에서 제공되는 터미널이 있음을 나타냅니다. 키보드와 관련된 텍스트 출력 인터페이스가 필요합니다. 일반적인 이유는 컬러 텍스트 출력 지원, 화살표 키와 같은 다양한 키 조합 처리 및 커서를 화면 주위로 이동하는 기능 때문입니다.
echo
예제 와 같이 명령을 docker로 파이프하면 파이프가 입력이며 파이프에 tty 인터페이스가 없으며 텍스트 스트림 일뿐입니다. 오류 메시지가 나타내는대로 tty를 작성하려고 시도하면 실패합니다.