容器对于 POSIX 父子进程关系是透明的吗?

容器对于 POSIX 父子进程关系是透明的吗?

想象一个假设的 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 和管道传递输入/输出。

相关内容