func push()

in container/go/cmd/pusher/pusher.go [166:212]


func push(dst string, img v1.Image) error {
	// Push the image to dst.
	ref, err := name.ParseReference(dst)
	if err != nil {
		return errors.Wrapf(err, "error parsing %q as an image reference", dst)
	}

	if *skipUnchangedDigest {
		exists, err := digestExists(dst, img)
		if err != nil {
			log.Printf("Error checking if digest already exists %v. Still pushing", err)
		}
		if exists {
			log.Print("Skipping push of unchanged digest")
			return nil
		}
	}

	options := []remote.Option{remote.WithAuthFromKeychain(authn.DefaultKeychain)}

	configPath := path.Join(os.Getenv("DOCKER_CONFIG"), "config.json")
	if _, err := os.Stat(configPath); err == nil {
		file, err := os.Open(configPath)
		if err != nil {
			return errors.Wrapf(err, "unable to open docker config")
		}

		var dockerConfig dockerHeaders
		err = json.NewDecoder(file).Decode(&dockerConfig)
		if err != nil {
			return errors.Wrapf(err, "error parsing docker config")
		}

		httpTransportOption := remote.WithTransport(&headerTransport{
			inner:       http.DefaultTransport,
			httpHeaders: dockerConfig.HTTPHeaders,
		})

		options = append(options, httpTransportOption)
	}

	if err := remote.Write(ref, img, options...); err != nil {
		return errors.Wrapf(err, "unable to push image to %s", dst)
	}

	return nil
}