【发布时间】:2020-10-30 15:02:13
【问题描述】:
我正在使用docker-py 将容器日志作为流读取。通过将stream 标志设置为True,如文档中所示。基本上,我正在遍历我的所有容器,并将它们的容器日志作为生成器读取,并将其写入如下文件:
for service in service_names:
dkg = self.container.logs(service, stream=True)
with open(path, 'wb') as output_file:
try:
while True:
line = next(dkg).decode("utf-8")
print('line is: ' + str(line))
if not line or "\n" not in line: # none of these work
print('Breaking...')
break
output_file.write(str(line.strip()))
except Exception as exc: # nor this
print('an exception occurred: ' + str(exc))
但是,它只读取第一个服务并在文件末尾挂起。它不会跳出循环,也不会引发异常(例如 StopIteration 异常)。根据文档,如果stream=True 它应该返回一个生成器,我打印出生成器类型,它显示为docker.types.daemon.CancellableStream 所以不要认为它会遵循传统的python 生成器,如果我们到达末尾,则会出现异常容器日志生成器并调用 next()。
如您所见,我尝试检查 eol 是否虚假或包含换行符,甚至查看它是否会捕获任何类型的异常但没有运气。 我还有其他方法吗?确定它是否到达服务流的末尾并跳出while循环并继续编写下一个服务?我想使用流的原因是因为大量数据导致我的系统内存不足,所以我更喜欢使用生成器。
【问题讨论】:
标签: python-3.x docker generator dockerpy