为什么将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