늦은 답변이지만 누군가를 도울 수 있습니다
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 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 특정 동작을 사용하지 않은, 따라서 청각 장애로 입력을 처리되지 않은합니다.