。
response = cl.build(fileobj=f, rm = True, tag='myv/v')
、彼らがそうであるように、コマンドラインから実行された場合の内容は見て成功した場合::あなたの最初の間違いは、応答をキャプチャないであるエラーケースで
list(response)
b'{"stream":" ---\\u003e bb44cb7f2d89\\n"}\r\n',
# snipped for brevity
b'{"stream":"Successfully built 6bc18019ddb6\\n"}\r\n']
を、例えば、愚かなを使用してdockerfile:
# a dockerfile with a type in 'MAINTAINER'
f = BytesIO('''
# Shared Volume
FROM busybox:buildroot-2014.02
MAINTAIER first last, [email protected]
VOLUME /data
CMD ["/bin/sh"]
'''.encode('utf-8'))
response
に含まれる出力は次のようになります。
[b'{"stream":"Step 1 : FROM busybox:buildroot-2014.02\\n"}\r\n',
b'{"stream":" ---\\u003e 9875fb006e07\\n"}\r\n',
b'{"stream":"Step 2 : MAINTAIER \\n"}\r\n',
b'{"errorDetail":{"message":"Unknown instruction: MAINTAIER"},"error":"Unknown instruction: MAINTAIER"}\r\n']
ご覧のとおり、エラーメッセージを含むのerrorDetail
が含まれています。だから、
、あなたはどちらかのバイト列検索で、それをチェックすることができます
class DockerBuildException(BaseException): pass
try:
responce = self.client.build(path=self.arguments.projectPath, pull=True, rm=False, tag=self.arguments.dockerImageTag)
for i in respone:
if b'errorDetail' in i:
raise DockerBuildException("Build Failed")
except DockerBuildException as e:
print("Error: " + e.args[0])
raise
または、より良い、ast.literal_eval
でdict
に各エントリを変換しても、ユーザーに通知するために指定したメッセージを使用して:
from ast import literal_eval
try:
responce = self.client.build(path=self.arguments.projectPath, pull=True, rm=False, tag=self.arguments.dockerImageTag)
for i in respone:
if b'errorDetail' in i:
d = literal_eval(i.decode('ascii')
raise DockerBuildException(d['errorDetail']['message'])
except DockerBuildException as e:
print("Error: " + e.args[0])
raise
私はまだ試していませんが、これまで説明してくれてありがとうございます。 –