示例#1
0
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
}