带python scrip的docker中的尾部堆栈

2024-09-27 09:23:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

FROM ubuntu:18.10
RUN apt-get update     && apt-get install -y --no-install-recommends python3    && rm -rf /var/lib/apt/lists/*
#RUN touch /tmp/file # uncomment will cause the problem
COPY . /app/
CMD ["python3","/app/main.py"]

主.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/文件),尽管我使用了相同的命令(echo“text”>;>;/tmp/文件),但我无法在docker屏幕中看到任何输出。
为什么会有这样的差异?即使文件存在,我怎么能看到输出?你知道吗

--编辑--
我尝试在第一个读取行之后添加exit(1),以消除缓冲区问题。
结果基本相同:
当线路与预期的集装箱出口一致时(出口代码为1)
但当管线未固定时,容器根本不会退出(可能是在管道读数时卡住)。
主.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"

Tags: 文件dockerrunpygt脚本stdoutline
2条回答

尝试系统标准冲洗()打印后,强制输出缓冲区也在屏幕上打印。它似乎适合我(相同的dockerfile和脚本)

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

这个选项,即零文件存在是合成的,在现实生活中真实的流创建的文件与内容,所以这就是为什么这个问题在互联网上不那么流行。你知道吗

如主题中所述,您需要验证文件是否存在以及大小是否为零。你知道吗

相关问题 更多 >

    热门问题