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
}