Os contêineres são transparentes para as relações de processo pai-filho POSIX?

2

Imagine um shell hipotético que inicia todos os comandos em contêineres ad-hoc com alguns controles de isolamento e recursos, dependendo da função de cada comando:

cat foo.txt | sed ... | xargs some-command

Um exemplo seria que cada comando tem alguns limites de memória, rede ou sistemas de arquivos montados somente de leitura.

É possível implementar esse shell de maneira transparente, para que os processos não percebam que cada um é executado em um contêiner e pode usar pipes UNIX, enviar sinais, etc.?

    
por sevo 20.07.2018 / 22:37

1 resposta

2

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.

    
por 21.07.2018 / 01:16