Muito interessante ...
docker run -d ubuntu:latest sleep infinity
$ docker exec -i sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
"a": "b",
"c": "d"
}
$ docker exec -it sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
"a": "b",
"c": "d"
}
$ docker exec -i -t sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
"a": "b",
"c": "d"
}
Separar -i
e -t
permite que o problema apareça ... (possivelmente um bug?)
Olhando a página do manual para docker exec
:
-t, --tty=true|false Allocate a pseudo-TTY. The default is false.
Os Pseudo-TTYs (PTYs) permitem que o sistema interaja com você (um humano) ... O resultado é que o docker aloca um novo PTY para a duração do exec
(dentro do container), e coisas como para produzir uma nova linha, a altura e a largura do terminal entram em ação - juntamente com uma carga de outras coisas.
Eu não posso explicar isso completamente, mas isso não é o que você quer de algo que está alimentando um canal.
Compare também:
$ docker exec -i sharp_einstein sh -c 'stty'
stty: 'standard input': Inappropriate ioctl for device
$ docker exec -i -t sharp_einstein sh -c 'stty'
speed 38400 baud; line = 0;
-brkint -imaxbel
$ stty
speed 38400 baud; line = 0;
-brkint -imaxbel
stty
é capaz de controlar o processamento de retornos de carro e novas linhas do PTY, embora essas opções não tenham efeito aqui para mim. Na página do manual:
* [-]ocrnl translate carriage return to newline * [-]onlcr translate newline to carriage return-newline
Observações semelhantes com sst -t
, por exemplo: step-stepping ao usar um pty (por meio de ssh) e canalização para mais