You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:25:19