Carriage-returns 在后台 运行 `tail -f` 而在前台 运行 `docker exec -it` 时不适用

Carriage-returns are not applied when running `tail -f` in the background while running `docker exec -it` in the foreground

当我在后台 运行 tail -f 和在前台 docker exec -it 时,tail-command 的输出已损坏。

例如,当我运行执行以下命令时:

$ tail -f log.txt &
$ docker exec -it my-container /bin/bash

我将以下 3 行附加到 log.txt:

cat
dog
bird

然后我得到以下奇怪的输出:

root@4083b121d1793:~# cat
                         dog
                            bird

注意换行符。 我猜马车 returns 没有应用。

为什么会出现这种奇怪的行为? 有什么解决办法吗?


更新

版本:

这似乎是因为在 docker/cli 源代码中调用了 MakeRaw() in the docker CLI. The docs explain that the function turns the file descriptor (stdin) into "raw mode" so it can be restored to its original state once the terminal session ends. These function calls all happen when setting up the interactive exec session in the CLI in hijack.go

This 是源代码中发生的地方。从这里可以看出,如果设置了NORAW环境变量,则得到正常的输出:

// SetRawTerminal sets raw mode on the input terminal
func (i *In) SetRawTerminal() (err error) {
    if os.Getenv("NORAW") != "" || !i.commonStream.isTerminal {
        return nil
    }
    i.commonStream.state, err = term.SetRawTerminal(i.commonStream.fd)

我是这样测试的,当 运行 执行命令时设置变量 NORAW

1 号航站楼:

$ tail -f log.txt
$ NORAW=1 docker exec -it containername /bin/bash
root@docker:/work$

2 号航站楼:

$ echo -e "something\nto\ntest" >> log.txt

返回 1 号航站楼:

root@docker:/work$ something
to
test

我完全重现了您之前的内容,但我碰巧在 Windows 和 WSL2 中进行了测试。

但是,设置 NORAW 后,您将不会像往常一样恢复到原始终端会话。在 ^Dexit 之后,您将立即将最后一个终端提示粘贴到光标所在的位置:

root@docker:/work$   $
^ docker prompt      ^ original terminal prompt session