func (builder *Builder) pushImage(image imagename.ImageName) (digest string, err error) { var ( pipeReader, pipeWriter = io.Pipe() errch = make(chan error) buf bytes.Buffer outStream = io.MultiWriter(pipeWriter, &buf) ) go func() { err := builder.Docker.PushImage(docker.PushImageOptions{ Name: image.NameWithRegistry(), Tag: image.GetTag(), Registry: image.Registry, OutputStream: outStream, RawJSONStream: true, }, *builder.Auth) if err := pipeWriter.Close(); err != nil { fmt.Fprintf(builder.OutStream, "pipeWriter.Close() err: %s\n", err) } errch <- err }() if err := jsonmessage.DisplayJSONMessagesStream(pipeReader, builder.OutStream, builder.fdOut, builder.isTerminalOut); err != nil { return "", fmt.Errorf("Failed to process json stream for image: %s, error: %s", image, err) } if err := <-errch; err != nil { return "", fmt.Errorf("Failed to push image: %s, error: %s", image, err) } // It is the best way to have pushed image digest so far matches := captureDigest.FindStringSubmatch(buf.String()) if len(matches) > 0 { digest = matches[1] } return digest, nil }