使用python脚本在docker中实现尾部堆栈

使用python脚本在docker中实现尾部堆栈,python,docker,Python,Docker,我正在尝试用简单的python脚本构建docker,从文件中读取并打印它。 我希望python脚本将继续从文件中读取,因为文件中可能有新数据。 但是当文件不存在时脚本启动时,tail似乎不起作用,也不读取文件。 下面是一个简单的例子: dockerfile(取消注释以说明问题) main.py import subprocess argsList = ['tail', '-c-1', '-F', '/tmp/file'] f = subprocess.Popen(argsList, stdout

我正在尝试用简单的python脚本构建docker,从文件中读取并打印它。
我希望python脚本将继续从文件中读取,因为文件中可能有新数据。
但是当文件不存在时脚本启动时,tail似乎不起作用,也不读取文件。
下面是一个简单的例子:

dockerfile(取消注释以说明问题)

main.py

import subprocess
argsList = ['tail', '-c-1', '-F', '/tmp/file']
f = subprocess.Popen(argsList, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
line = f.stdout.readline()
while line != b'':
    line = f.stdout.readline().decode("utf-8")
    print(line)
如果我进入docker(当没有/tmp/文件时)并开始写入该文件(使用echo“text”>/tmp/文件),我可以看到docker屏幕中的输出。
但是,如果我取消docker文件中触摸注释的注释(导致创建/tmp/文件),我无法在docker屏幕中看到任何输出,尽管我使用了相同的命令(echo“text”>/tmp/文件)。
为什么会有这样的差异?即使文件存在,我如何看到输出

--编辑--
我已尝试在第一个读取行之后添加出口(1),以消除缓冲区问题。
结果基本相同:
当该行与预期的容器出口一致时(出口代码为1)
但是,当管线未覆盖时,容器根本不会退出(可能在从管道读取时卡住)。
main.py

import subprocess
argsList = ['tail', '-c-1', '-F', '/tmp/file']
f = subprocess.Popen(argsList, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
line = f.stdout.readline()
exit(1)
--编辑2--
如果只有docker文件:
dockerfile

FROM ubuntu:18.10
#RUN touch /tmp/file
CMD "tail" "-c-1" "-F" "/tmp/file"

这是已知的行为,这个问题与零大小文件有关,如果您尝试在容器中使用simple
tail-f
,您将看到相同的行为。这也解释了原因

这个选项,即零文件存在是合成的,在现实生活中,real streams创建包含内容的文件,所以这就是为什么这个问题在互联网上不那么流行的原因


如主题中所述,您需要验证文件是否存在且大小是否为零。

打印后尝试使用sys.stdout.flush(),以强制在屏幕上打印输出缓冲区。它似乎对我有效(相同的docker文件和脚本)

您是否尝试取消docker文件中touch命令的注释?这个问题只有在已经存在文件的情况下才会发生。是的,我使用dockerfile()和main.py()进行了测试,我尝试按照您的建议进行测试,但结果相同。我看不到容器中的任何输出。无论如何,我添加了未打印的示例,因此很遗憾缓冲区不是:(这很有趣,可能是我的问题,但区别在于我用-F来表示尾部,在这个问题中,用-F表示尾部。
FROM ubuntu:18.10
#RUN touch /tmp/file
CMD "tail" "-c-1" "-F" "/tmp/file"