我有一个启动 docker 容器的 shell 脚本。在启动容器之前,它会启动一个后台循环,将一些行打印到终端。我注意到这些打印的行不会将光标返回到行首。我发现:这只发生在容器的生命周期内。请参阅最小示例:
#!/usr/bin/env bash
cleanup() {
kill "${BACKGROUND_PROCESS}"
}
trap cleanup EXIT
backgroundLoop() {
while true; do
echo .
sleep 1
done
}
backgroundLoop &
BACKGROUND_PROCESS=$!
sleep 2
echo Starting docker
docker run --rm -it alpine sleep 5
echo Docker has finished
sleep 2
cleanup
输出为:
.
.
Starting docker
.
.
.
.
.
.
Docker has finished
.
.
有人能解释为什么会发生这种情况吗?这似乎与这个问题有关,我假设docker重新配置了当前TTY并在之后恢复它。对吗?
从 docker 调用中删除-t
实际上可以解决问题,这似乎支持了我的理论。但是,对于我的实际用例,我需要交互式 TTY。
我怎样才能更改代码以便所有输出行都打印正确的回车符?
更新:
stty -onocr
我得到了这个问题的答案,通过在实际命令之前调用docker容器解决了我上面发布的最小示例的问题。
但是,我的实际场景使用带有 bash 脚本的自定义 docker 镜像作为入口点,因此我无法传递命令作为参数。入口点脚本的最小示例entrypoint.sh
:
#!/usr/bin/env sh
sleep 5
然后在测试脚本中替换docker调用
docker run --rm -it alpine sleep 5
和
docker run --rm -it -v ./entrypoint.sh:/entrypoint.sh --entrypoint /entrypoint.sh alpine
输出相同,但建议的修复在此情况下不起作用。有什么想法可以将修复应用于这个略有不同的环境吗?