func main()

in example/ecr-push/main.go [44:109]


func main() {
	ctx := namespaces.NamespaceFromEnv(context.Background())
	//logrus.SetLevel(logrus.DebugLevel)

	if len(os.Args) < 2 {
		log.G(ctx).Fatal("Must provide image to push as argument")
	}
	ref := os.Args[1]
	local := ""
	if len(os.Args) > 2 {
		local = os.Args[2]
	} else {
		local = ref
	}

	enableDebug := defaultEnableDebug
	parseEnvInt(ctx, "ECR_PUSH_DEBUG", &enableDebug)
	if enableDebug == 1 {
		log.L.Logger.SetLevel(logrus.TraceLevel)
	}

	client, err := containerd.New("/run/containerd/containerd.sock")
	if err != nil {
		log.G(ctx).WithError(err).Fatal("Failed to connect to containerd")
	}
	defer client.Close()

	tracker := docker.NewInMemoryTracker()
	resolver, err := ecr.NewResolver(ecr.WithTracker(tracker))
	if err != nil {
		log.G(ctx).WithError(err).Fatal("Failed to create resolver")
	}

	img, err := client.ImageService().Get(ctx, local)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	ongoing := newPushJobs(tracker)
	eg, ctx := errgroup.WithContext(ctx)
	eg.Go(func() error {
		log.G(ctx).WithField("local", local).WithField("ref", ref).Info("Pushing to Amazon ECR")
		desc := img.Target

		jobHandler := images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
			ongoing.add(remotes.MakeRefKey(ctx, desc))
			return nil, nil
		})

		return client.Push(ctx, ref, desc,
			containerd.WithResolver(resolver),
			containerd.WithImageHandler(jobHandler))
	})
	errs := make(chan error)
	go func() {
		defer close(errs)
		errs <- eg.Wait()
	}()

	err = displayUploadProgress(ctx, ongoing, errs)
	if err != nil {
		log.G(ctx).WithError(err).WithField("ref", ref).Fatal("Failed to push")
	}
	log.G(ctx).WithField("ref", ref).Info("Pushed successfully!")
}