docker-py: 如何检查构建是否成功?
docker-py: how can I check if the build was successful?
我正在尝试在 Python 3 中为自己构建一个整洁的管道。我的问题是,一切似乎都运行良好,Jenkins 总是给我一个绿色气泡,但有时 docker 构建失败执行。
因此 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
如果构建失败,不会引发错误。
有人可以帮我找到正确的方法吗?我如何确定我的构建已完成,如果没有收到有效消息?我完全迷路了。
此致
微
client.build
returns docker
在发出 docker build
命令时输出的消息。您最初的错误是没有捕获响应:
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, first.last@yourdomain.com
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
个 key
,其中包含错误消息。
因此,您可以使用字节字符串搜索来检查:
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
我正在尝试在 Python 3 中为自己构建一个整洁的管道。我的问题是,一切似乎都运行良好,Jenkins 总是给我一个绿色气泡,但有时 docker 构建失败执行。
因此 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
如果构建失败,不会引发错误。
有人可以帮我找到正确的方法吗?我如何确定我的构建已完成,如果没有收到有效消息?我完全迷路了。
此致 微
client.build
returns docker
在发出 docker build
命令时输出的消息。您最初的错误是没有捕获响应:
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, first.last@yourdomain.com
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
个 key
,其中包含错误消息。
因此,您可以使用字节字符串搜索来检查:
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