각 명령의 기능을 기반으로 일부 격리 및 리소스 제어를 통해 임시 컨테이너에서 모든 명령을 실행하는 가상의 셸을 상상해 보세요.
cat foo.txt | sed ... | xargs some-command
예를 들어 각 명령에는 메모리, 네트워크 없음 또는 읽기 전용으로 마운트된 파일 시스템에 대한 일부 제한이 있습니다.
프로세스가 각 프로세스가 컨테이너에서 실행되고 있다는 사실을 인식하지 못하고 UNIX 파이프를 사용하고 신호를 보낼 수 있도록 이러한 셸을 투명한 방식으로 구현할 수 있습니까?
답변1
질문하신 내용을 이해한다면 파이프의 다양한 경계에 있는 컨테이너가 STDIN을 올바르게 수신하고 STDOUT을 통해 모든 것을 내보내는 한 이것이 왜 불가능한지 알 수 없습니다.
당신은 기본적으로 이것을 묻고 있습니다 :
$ cat.txt | <container 1 app> | <container 2 app> | ...
이것은 작동합니다.
예
여기에는 이 스크립트를 실행하는 것 외에는 아무것도 수행하지 않는 Docker 컨테이너가 있습니다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28c19c338e6e sleeper "/tmp/run.sh" 6 days ago Up 4 minutes focused_lumiere
그리고 내부 스크립트는 다음과 같습니다.
$ docker exec -it 28c19c338e6e cat /tmp/run.sh
#!/bin/bash
while true; do sleep 30; done
이제 다음과 같은 명령을 실행하려면 다음을 수행하십시오.
$ docker exec -it 28c19c338e6e bash -c "echo hi" | \
docker exec -i 28c19c338e6e bash -c "grep hi"
hi
$
다른 일을 하고 싶다면 grep
:
$ docker exec -it 28c19c338e6e bash -c "echo hi" | \
docker exec -i 28c19c338e6e bash -c "grep bye"
$
이러한 docker
각 명령은 컨테이너 내에서 자체 명령을 실행하지만 STDIN/STDOUT을 통해 실행 중인 Bash 셸과 파이프에 입력/출력을 전달합니다.