docker exec bagunça os feeds da linha de terminal?

2

Quando canalizo a saída de docker exec para outro comando, parece que isso atrapalha os finais de linha do meu terminal.

Por exemplo:

$ docker exec -it foo sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
   "a": "b",
              "c": "d"
                      }
                       $

Mas se eu imediatamente executar o mesmo comando, no mesmo terminal, no host:

$ sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
  "a": "b",
  "c": "d"
}

... como esperado.

Se eu canalizar a saída através de xxd , parece introduzir um caractere CR, assim como o LF (0d0a, em vez de 0a); isso também atrapalha a saída de xxd :

$ docker exec -i -t foo sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | xxd
00000000: 7b22 6122 3a22 6222 2c22 6322 3a22 6422  {"a":"b","c":"d"
                                                                   00000010: 7d0d 0a  

Se eu tentar excluir a janela de encaixe emitindo \r\n , tudo bem:

$ printf "{\"a\":\"b\",\"c\":\"d\"}\r\n" | xxd
00000000: 7b22 6122 3a22 6222 2c22 6322 3a22 6422  {"a":"b","c":"d"
00000010: 7d0d 0a                                  }..
$

... o que implica que é docker exec .

Meu host e o contêiner estão executando o Linux. docker info relatórios Server Version: 18.03.1-ce . docker -v relatórios Docker version 18.03.1-ce, build 9ee9f40 .

O que o docker exec fez no meu terminal (temporariamente) e como corrigi-lo?

    
por Roger Lipscombe 29.05.2018 / 14:50

2 respostas

2

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

    
por 29.05.2018 / 15:28
0

Você tentou com "-n" em "echo -n " como:

$ docker exec -it upbeat_mendeleev sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq .
{
   "a": "b",
              "c": "d"
                      }


$ docker exec -it upbeat_mendeleev sh -c 'echo -n {\"a\":\"b\",\"c\":\"d\"}' | jq .
{
  "a": "b",
  "c": "d"
}
    
por 29.05.2018 / 15:13