2015-11-06 2 views
1

Я использую docker-py для создания и запуска изображений Docker.Как я могу обнаружить, когда docker-py client.build() не удается

От чтения the documentation мне не ясно, как я должен определить, была ли ошибка при создании изображения. build() не вызывает исключения при возникновении ошибки. Это заставляет меня думать, что я должен исследовать ответы, которые возвращаются.

Каков наилучший способ определить, не завершился ли клиент docker-py client.build()?

ответ

0

Похоже, что «лучший» способ - декодировать ответ и искать ключ с именем «ошибка».

Например:

for response in client.build(path, tag, decode=True): 
    if response.has_key('error'): 
     raise Exception("Error building docker image: {}".format(response['error'])) 
0

Создайте StreamLineBuilder генератор:

import json 
class StreamLineBuildGenerator(object): 
    def __init__(self, json_data): 
     self.__dict__ = json.loads(json_data) 

, а затем использовать этот генератор для того, чтобы разобрать ваш поток:

import docker 
docker_client = docker.Client(version="1.18", base_url="unix:///var/run/docker.sock") 

generator = docker_client.build(nocache=False, rm=True, stream=True, tag="my_image_tag", path="my_path") 

for line in generator: 
    try: 
     stream_line = StreamLineBuildGenerator(line) 
     if hasattr(stream_line, "error"): 
      print(stream_line.error) 
      if hasattr(stream_line, "errorDetail"): 
       if not stream_line.error == stream_line.errorDetail["message"]: 
        if hasattr(stream_line.errorDetail, "code"): 
         print("[" + stream_line.errorDetail["code"] + "] ", False) 
        print(stream_line.errorDetail["message"]) 
    except ValueError: 
     # If we are not able to deserialize the received line as JSON object, just print it out 
     print(line) 
     continue 
Смежные вопросы