docker exec弄乱了终端换行?

罗杰·利普斯科姆

当我将输出通过管道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自己来排除docker ,那就很好:

$ 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-cedocker -v报告Docker version 18.03.1-ce, build 9ee9f40

docker exec(临时)对我的终端做了什么,我该如何解决?

阿蒂

很有意思...

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允许问题出现......(possbly一个错误?)


在手册页中查找docker exec

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

伪TTY(PTY)允许系统与您(人类)进行交互...结果是,泊坞窗在exec(容器内部)期间分配了一个新的PTY ,以及如何生成换行符,终端的高度和宽度–以及其他负载。

我无法完全解释它,但这不是您想要的东西,它正在馈入管道。


还比较:

$ 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)时进行阶梯式踩踏,并通过管道将其踩到更多

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从python启动docker容器会弄乱终端设置

来自分类Dev

Docker exec bash交互式小终端窗口

来自分类Dev

Docker终端与链接组成

来自分类Dev

docker exec丢失

来自分类Dev

Docker exec 命令失败?

来自分类Dev

与docker exec等效的boot2docker

来自分类Dev

附加终端并启动 docker compose?

来自分类Dev

bash脚本中的Docker exec

来自分类Dev

exec docker运行时docker中的环境变量

来自分类Dev

通过终端访问Docker容器的文件系统

来自分类Dev

更改Docker Quickstart Terminal的终端应用

来自分类Dev

Docker:bash终端启动无提示

来自分类Dev

带有哑终端的“ docker run -dti”

来自分类Dev

如何关闭并重新打开Docker终端

来自分类Dev

为Kafka现场Docker运行多个终端

来自分类Dev

如何让我的Docker终端完成命令?

来自分类Dev

通过终端访问Docker容器的文件系统

来自分类Dev

如何在Docker中增加终端尺寸

来自分类Dev

如何更改Docker终端启动脚本?

来自分类Dev

终端(bash?)/ Docker:背后的逻辑 - 和 -

来自分类Dev

docker exec在cron中不起作用

来自分类Dev

Docker exec至少需要2个参数

来自分类Dev

无法执行Docker exec * ID * -it命令

来自分类Dev

将命令组直接导入docker exec

来自分类Dev

找不到docker-entrypoint exec nginx

来自分类Dev

如何使用docker exec运行源代码?

来自分类Dev

通过php shell_exec的Docker命令

来自分类Dev

无业游民的docker-exec

来自分类Dev

检查分离的Docker exec命令的过程