Я использую 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))
Однако он читает только первую службу и зависает в конец файла. Он не выходит из l oop и не вызывает исключения (например, исключение StopIteration). Согласно документам, если stream=True
он должен вернуть генератор, я распечатал тип генератора, и он отображается как docker.types.daemon.CancellableStream
, поэтому не думайте, что он будет следовать традиционному генератору python и исключить исключение, если мы нажмем конец генератора журнала контейнера и вызовите next ().
Как видите, я пытался проверить, является ли eol ложным или содержит новую строку, даже посмотреть, поймает ли он какой-либо тип исключения, но не повезло. Есть другой способ. определить, попадает ли он в конец потока для службы, выйти из while
l oop и продолжить запись следующей службы? Я хотел использовать поток, потому что большой объем данных в моей системе не хватало памяти, поэтому я предпочитаю использовать генератор.