2016-09-19 26 views
0

私はPython 3できれいなパイプラインを構築しようとしています。私の問題は、すべてがうまくいくようですが、ジェンキンスは常に私に緑のバブルを与えますが、ドッカーのビルドが失敗することがあります。docker-py:ビルドが成功したかどうかをどうやって確認できますか?

何らかの理由でビルドブレークのであればclient.buildではエラーは発生しません:ビルドが失敗した場合

try: 
    self.client.build(path=self.arguments.projectPath, pull=True, rm=False, tag=self.arguments.dockerImageTag) 
except: 
    print("Error: Docker did not build) 
    raise 

はエラーは発生しません。

誰かが正しい方法を見つけるのを手伝ってもらえますか、ビルドが完了したかどうか、有効なメッセージが表示されない場合はどうすればいいですか?私は完全に失われています。

敬具docker buildコマンドを発行するときdockerが出力するメッセージを返しますclient.build ミルコ

答えて

2

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_evaldictに各エントリを変換しても、ユーザーに通知するために指定したメッセージを使用して:

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 
+0

私はまだ試していませんが、これまで説明してくれてありがとうございます。 –

関連する問題