in container/go/cmd/pusher/pusher.go [73:139]
func main() {
flag.Var(&layers, "layer", "One or more layers with the following comma separated values (Compressed layer tarball, Uncompressed layer tarball, digest file, diff ID file). e.g., --layer layer.tar.gz,layer.tar,<file with digest>,<file with diffID>.")
flag.Var(&stampInfoFile, "stamp-info-file", "The list of paths to the stamp info files used to substitute supported attribute when a python format placeholder is provivided in dst, e.g., {BUILD_USER}.")
flag.Parse()
if *dst == "" {
log.Fatalln("Required option -dst was not specified.")
}
if *format == "" {
log.Fatalln("Required option -format was not specified.")
}
if *imgTarball == "" && *imgConfig == "" {
log.Fatalln("Neither --tarball nor --config was specified.")
}
// If the user provided a client config directory, ensure it's a valid
// directory and instruct the keychain resolver to use it to look for the
// docker client config.
if err := checkClientConfig(*clientConfigDir); err != nil {
log.Fatalf("Failed to validate the Docker client config dir %q specified via --client-config-dir: %v", *clientConfigDir, err)
}
if *clientConfigDir != "" {
os.Setenv("DOCKER_CONFIG", *clientConfigDir)
}
imgParts, err := compat.ImagePartsFromArgs(*imgConfig, *baseManifest, *imgTarball, layers)
if err != nil {
log.Fatalf("Unable to determine parts of the image from the specified arguments: %v", err)
}
img, err := compat.ReadImage(imgParts)
if err != nil {
log.Fatalf("Error reading image: %v", err)
}
if *format == "OCI" {
img, err = oci.AsOCIImage(img)
if err != nil {
log.Fatalf("Failed to convert image to OCI format: %v", err)
}
}
stamper, err := compat.NewStamper(stampInfoFile)
if err != nil {
log.Fatalf("Failed to initialize the stamper: %v", err)
}
// Infer stamp info if provided and perform substitutions in the provided tag name.
stamped := stamper.Stamp(*dst)
if stamped != *dst {
log.Printf("Destination %s was resolved to %s after stamping.", *dst, stamped)
}
digest, err := img.Digest()
if err != nil {
log.Printf("Failed to digest image: %v", err)
}
if err := push(stamped, img); err != nil {
log.Fatalf("Error pushing image to %s: %v", stamped, err)
}
digestStr := ""
if !strings.Contains(stamped, "@") {
digestStr = fmt.Sprintf(" - %s@%s", strings.Split(stamped, ":")[0], digest)
}
log.Printf("Successfully pushed %s image to %s%s", *format, stamped, digestStr)
}