当将管道输出到其他命令时,为什么Docker伪tty mangle输出



为什么将docker输出输出的docker pseudo-tty选项修改为其他命令?

Docker使用-t选项运行时使用CRLF线路结束。因此,这是我的2个命令,其中 CR添加到另一个命令以使其输出相同。

❯ docker run --rm -ti bash bash -c "echo -n $'nnn'" | od -c
0000000  r  n  r  n  r  n
❯ docker run --rm bash bash -c "echo -n $'rnrnrn'" | od -c
0000000  r  n  r  n  r  n

两个命令在读取-loop时被管道运送到(我希望两个输出都相同)

❯ while read -r out; do echo A; done < <(docker run --rm -ti bash bash -c "echo -n $'nnn'")
A
 A
  A
❯ while read -r out; do echo A; done < <(docker run --rm bash bash -c "echo -n $'rnrnrn'")
A
A
A

为什么会发生这种情况?为什么伪tty断裂输出?不应该只告诉Docker输入是终端设备吗?

当然,不使用-it进行非相互作用脚本是一个有效的解决方案,但没有回答"为什么"。

看来,当提供--tty选项时,Docker客户端将docker客户端设置为原始模式。在cli/command/container/hijack.go中定义的函数setRawTerminal(streams)中有呼叫CC_6,该函数在RAW模式(GitHub链接)中均设置了stdin和stdout。

据我所知,这种原始模式然后传播回您使用的终端。您可以通过从以下示例中删除stty -raw并按顺序运行。

在简短的原始模式下,意味着终端不应进行任何线路处理,即终端不对CR(r)作用。

没有Docker客户端的简单排列:

❯ while read -r out; do echo A; done < <(bash -c "stty raw; echo -n $'nnn'")   
A
 A
  A
❯ while read -r out; do echo A; done < <(bash -c "stty -raw; echo -n $'nnn'")
A
A
A

或仅:

❯ stty raw; for i in {0..2}; do echo A; done
A
 A
  A
❯ stty -raw; for i in {0..2}; do echo A; done
A
A
A

相关内容

  • 没有找到相关文章

最新更新