【问题标题】:docker-py reading container logs as a generator hangsdocker-py 在生成器挂起时读取容器日志
【发布时间】: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


    【解决方案1】:

    问题在于,直到容器停止,流才真正停止,它只是暂停等待下一个数据到达。为了说明这一点,当它挂在第一个容器上时,如果您在该容器上执行 docker stop,您将收到 StopIteration 异常,并且您的 for 循环将转到下一个容器的日志。

    您可以使用follow = False 告诉.logs() 不要关注日志。奇怪的是,文档说默认值为 False,但情况似乎并非如此,至少对于流媒体而言并非如此。

    我遇到了同样的问题,这段使用follow = False 的代码摘录没有挂在第一个容器的日志中:

    import docker
    client = docker.from_env()
    container_names = ['container1','container2','container3']
    for container_name in container_names:
        dkg = client.containers.get(container_name).logs(stream = True, follow = False)
        try:
          while True:
            line = next(dkg).decode("utf-8")
            print(line)
        except StopIteration:
          print(f'log stream ended for {container_name}')   
    

    【讨论】:

      猜你喜欢
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2021-12-13
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多