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!")
}