docker运行输出出现故障

docker运行输出出现故障,docker,stdout,Docker,Stdout,我将直接进入一个示例: docker run --rm -i alpine /bin/sh -vs <<EOF echo BEFORE cat /etc/*elease echo AFTER EOF 请注意,sh-v打印的命令本身(如echo BEFORE)显示在任何命令输出(如BEFORE)之前 我希望看到 echo BEFORE BEFORE cat /etc/*elease 3.9.3 NAME="Alpine Linux" ID=alpine VERSION_ID=3.9

我将直接进入一个示例:

docker run --rm -i alpine /bin/sh -vs <<EOF
echo BEFORE
cat /etc/*elease
echo AFTER
EOF

请注意,
sh-v
打印的命令本身(如
echo BEFORE
)显示在任何命令输出(如
BEFORE
)之前

我希望看到

echo BEFORE
BEFORE
cat /etc/*elease
3.9.3
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.9.3
PRETTY_NAME="Alpine Linux v3.9"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
echo AFTER
AFTER
例如,我尝试使用
stdbuf
script
,但没有效果

我不认为我是唯一一个有这个问题的人。所以我想知道

  • 是什么原因造成了如此混乱的产出
  • 有办法解决吗

我通过将stdout重定向到stderr解决了这个问题:

docker run --rm -i alpine /bin/sh -vs <<EOF
exec 1>&2
echo BEFORE
cat /etc/*elease
echo AFTER
EOF

docker run--rm-i alpine/bin/sh-vs只是说“shell在读取时将其输入写入标准错误”,所以这对我来说就像shell在执行任何操作之前读取其所有输入一样。这似乎是一个合理的实现选择,特别是对于小的输入。您的应用程序中是否存在依赖于此行为的特定内容,您能否在问题中包含其源代码?@DavidMaze,看来sh和bash确实不能保证在命令输出之前打印输入行。但是,通常建议使用-v或-x选项(存在相同的问题):>应用程序中是否存在依赖于此行为的特定内容?不,一点也不。我问这个问题主要是出于好奇。我刚刚从docker映像(如/etc/*elease、python版本、openssl版本等)中转储了一些信息,并遇到了这种行为。@DavidMaze,在您链接的帮助下,我意识到是stdout和stderr混淆了。通过使用
exec 1>&2
将stdout重定向到stderr(将其置于其他命令之前),可以解决此问题
docker run --rm -i alpine /bin/sh -vs <<EOF
exec 1>&2
echo BEFORE
cat /etc/*elease
echo AFTER
EOF