diff --git a/util/dockerutil/client.go b/util/dockerutil/client.go index 5a1ff36f..764c42ee 100644 --- a/util/dockerutil/client.go +++ b/util/dockerutil/client.go @@ -46,17 +46,24 @@ func (c *Client) LoadImage(ctx context.Context, name string, status progress.Wri w = &waitingWriter{ PipeWriter: pw, f: func() { - resp, err := dapi.ImageLoad(ctx, pr, false) - defer close(done) - if err != nil { + handleErr := func(err error) { pr.CloseWithError(err) w.mu.Lock() w.err = err w.mu.Unlock() + } + + resp, err := dapi.ImageLoad(ctx, pr, false) + defer close(done) + if err != nil { + handleErr(err) return } + prog := progress.WithPrefix(status, "", false) - progress.FromReader(prog, "importing to docker", resp.Body) + if err := fromReader(prog, "importing to docker", resp.Body); err != nil { + handleErr(err) + } }, done: done, cancel: cancel, diff --git a/util/progress/fromreader.go b/util/dockerutil/progress.go similarity index 55% rename from util/progress/fromreader.go rename to util/dockerutil/progress.go index dbff5afc..d54be24e 100644 --- a/util/progress/fromreader.go +++ b/util/dockerutil/progress.go @@ -1,15 +1,19 @@ -package progress +package dockerutil import ( + "errors" "io" "time" + "github.com/docker/buildx/util/progress" + "github.com/docker/cli/cli/streams" + "github.com/docker/docker/pkg/jsonmessage" "github.com/moby/buildkit/client" "github.com/moby/buildkit/identity" "github.com/opencontainers/go-digest" ) -func FromReader(w Writer, name string, rc io.ReadCloser) { +func fromReader(w progress.Writer, name string, rc io.ReadCloser) error { dgst := digest.FromBytes([]byte(identity.NewID())) tm := time.Now() @@ -23,7 +27,12 @@ func FromReader(w Writer, name string, rc io.ReadCloser) { Vertexes: []*client.Vertex{&vtx}, }) - _, err := io.Copy(io.Discard, rc) + err := jsonmessage.DisplayJSONMessagesToStream(rc, streams.NewOut(io.Discard), nil) + if err != nil { + if jerr, ok := err.(*jsonmessage.JSONError); ok { + err = errors.New(jerr.Message) + } + } tm2 := time.Now() vtx2 := vtx @@ -34,4 +43,5 @@ func FromReader(w Writer, name string, rc io.ReadCloser) { w.Write(&client.SolveStatus{ Vertexes: []*client.Vertex{&vtx2}, }) + return err }