求助:Golang客户端提取Docker BuildKit构建日志的解码问题
基于Golang的Docker客户端提取BuildKit构建日志问题
- 使用Golang的Docker客户端向dockerd(BuildKit/Moby)发送镜像构建请求后,可正常接收JSON消息流并解码为
Jsonmessage实例,但构建日志行以base64编码形式存储在每个JSON消息的aux字段中。 - 解码base64内容后,得到的结果包含奇怪的终端控制字符和编码异常数据,推测这可能是某个结构体的base64编码,但始终找不到对应的解码与处理逻辑。
- 查阅docker-ce/Moby代码时发现,
docker buildx build处理构建进度日志时,未对aux负载做特殊处理的相关逻辑。
示例构建代码
image := Image{Name: "test"} contextreader, err := archive.TarWithOptions(buildConf.Build.Context, &archive.TarOptions{}) if err != nil { return err } imageBuildResponse, err := b.client.ImageBuild( ctx, contextreader, types.ImageBuildOptions{ Version: types.BuilderBuildKit, Context: contextreader, Dockerfile: dockerfile, }) if err != nil { return err } defer imageBuildResponse.Body.Close() buf := bytes.NewBuffer(nil) imageID := "" writeAux := func(msg jsonmessage.JSONMessage) error { if msg.ID == "moby.image.id" { var result types.BuildResult if err := json.Unmarshal(*msg.Aux, &result); err != nil { panic("don't do this in your real code") } imageID = result.ID return nil } return nil } err := jsonmessage.DisplayJSONMessagesStream(imageBuildResponse.Body, buf, os.Stderr.Fd(), false /* not terminal */, writeAux) if err != nil { if jerr, ok := err.(*jsonmessage.JSONError); ok { // If no error code is set, default to 1 if jerr.Code == 0 { jerr.Code = 1 } return fmt.Errorf("error while building image: %s", jerr.Message) } }
输出的JSON负载
{"id":"moby.buildkit.trace","aux":"Cn0KR3NoYTI1NjozZThhMzMxYmRkZGFjNWZkYmNjOGVhMDFmYWFhYmM3MjA0MDkwMmYwNjdmYzRhOGY0NDJmMmIzYWVlN2RkNGIyGiRbaW50ZXJuYWxdIGxvYWQgcmVtb3RlIGJ1aWxkIGNvbnRleHQqDAiYw8KaBhCykpCqAg=="} {"id":"moby.buildkit.trace","aux":"CokBCkdzaGEyNTY6M2U4YTMzMWJkZGRhYzVmZGJjYzhlYTAxZmFhYWJjNzIwNDA5MDJmMDY3ZmM0YThmNDQyZjJiM2FlZTdkZDRiMhokW2ludGVybmFsXSBsb2FkIHJlbW90ZSBidWlsZCBjb250ZXh0KgwImMPCmgYQspKQqgIyCgiZw8KaBhD08F0="}
base64解码后的异常输出
$ base64 -d <<<'Cn0KR3NoYTI1NjozZThhMzMxYmRkZGFjNWZkYmNjOGVhMDFmYWFhYmM3MjA0MDkwMmYwNjdmYzRhOGY0NDJmMmIzYWVlN2RkNGIyGiRbaW50ZXJuYWxdIGxvYWQgcmVtb3RlIGJ1aWxkIGNvbnRleHQqDAiYw8KaBhCykpCqAg==' } Gsha256:3e8a331bdddac5fdbcc8ea01faaabc72040902f067fc4a8f442f2b3aee7dd4b2�$[internal] load remote build context* ������
内容的提问来源于stack exchange,提问作者Craig Ringer
相关产品推荐
相关产品推荐

