Se eu entendi o que você está perguntando, não vejo por que isso não seria possível, desde que os contêineres nos vários limites dos canais apropriadamente utilizassem STDIN e emitissem tudo via STDOUT.
Você está basicamente perguntando isso:
$ cat.txt | <container 1 app> | <container 2 app> | ...
Isso deve funcionar.
Exemplo
Aqui eu tenho um contêiner docker que não faz nada além de executar este script:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28c19c338e6e sleeper "/tmp/run.sh" 6 days ago Up 4 minutes focused_lumiere
E o script dentro:
$ docker exec -it 28c19c338e6e cat /tmp/run.sh
#!/bin/bash
while true; do sleep 30; done
Agora, se fôssemos executar comandos como este:
$ docker exec -it 28c19c338e6e bash -c "echo hi" | \
docker exec -i 28c19c338e6e bash -c "grep hi"
hi
$
E se fôssemos grep
para outra coisa:
$ docker exec -it 28c19c338e6e bash -c "echo hi" | \
docker exec -i 28c19c338e6e bash -c "grep bye"
$
Cada um desses comandos docker
está executando seus respectivos comandos dentro do contêiner, mas eles estão passando entrada / saída via STDIN / STDOUT com o shell Bash e os canais em que estou executando.