2

Когда я перенаправляю вывод из docker exec в другую команду, он, похоже, портит окончания строк моего терминала.

Например:

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

Но если я тогда сразу же выполню ту же команду на том же терминале на хосте:

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

...как и ожидалось.

Если я передаю вывод через xxd , он, похоже, вводит символ CR, а также LF (0d0a, а не 0a); это также портит вывод из 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  

Если я попытаюсь исключить докер, выдав \r\n сам, все будет в порядке:

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

... что означает, что это docker exec .

И мой хост, и контейнер работают под управлением Linux. docker info отчеты Server Version: 18.03.1-ce . docker -v сообщает о Docker version 18.03.1-ce, build 9ee9f40 .

Что docker exec сделал с моим терминалом (временно) и как мне это исправить?

2 ответа2

2

Очень интересно...

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"
                      }

Разделение -i и -t позволяет появиться проблеме ... (возможно, ошибка?)


Глядя на справочную страницу для docker exec:

  -t, --tty=true|false
      Allocate a pseudo-TTY. The default is false.

Псевдо-TTY (PTY) позволяют системе взаимодействовать с вами (человеком) ... В результате docker выделяет новый PTY на время exec (внутри контейнера), и такие вещи, как создание новой строки, высота и ширина терминала, а также множество других вещей.

Я не могу полностью объяснить это, но это не то, что вы хотите от чего-то, что подается в трубопровод.


Сравните также:

$ 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 может контролировать обработку возврата каретки и перевода строки в PTY, хотя эти параметры для меня не имели никакого значения. Со страницы руководства:

  * [-]ocrnl
          translate carriage return to newline

  * [-]onlcr
          translate newline to carriage return-newline

Есть аналогичные наблюдения с sst -t , например: ступеньки при использовании pty (через ssh) и более

0

Вы пробовали с "-n" на "echo -n " как:

$ 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"
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .