想象一个假设的 shell,它在临时容器中启动所有命令,并根据每个命令的功能进行一些隔离和资源控制:
cat foo.txt | sed ... | xargs some-command
一个例子是每个命令对内存、无网络或只读安装的文件系统都有一些限制。
这样的 shell 是否可以以透明的方式实现,以便进程不知道每个进程都在容器中运行,并且可以使用 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 shell 和管道传递输入/输出。