92 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
| package registry
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 
 | |
| 	dcontext "github.com/distribution/distribution/v3/context"
 | |
| 	"github.com/distribution/distribution/v3/registry/storage"
 | |
| 	"github.com/distribution/distribution/v3/registry/storage/driver/factory"
 | |
| 	"github.com/distribution/distribution/v3/version"
 | |
| 	"github.com/docker/libtrust"
 | |
| 	"github.com/spf13/cobra"
 | |
| )
 | |
| 
 | |
| var showVersion bool
 | |
| 
 | |
| func init() {
 | |
| 	RootCmd.AddCommand(ServeCmd)
 | |
| 	RootCmd.AddCommand(GCCmd)
 | |
| 	GCCmd.Flags().BoolVarP(&dryRun, "dry-run", "d", false, "do everything except remove the blobs")
 | |
| 	GCCmd.Flags().BoolVarP(&removeUntagged, "delete-untagged", "m", false, "delete manifests that are not currently referenced via tag")
 | |
| 	RootCmd.Flags().BoolVarP(&showVersion, "version", "v", false, "show the version and exit")
 | |
| }
 | |
| 
 | |
| // RootCmd is the main command for the 'registry' binary.
 | |
| var RootCmd = &cobra.Command{
 | |
| 	Use:   "registry",
 | |
| 	Short: "`registry`",
 | |
| 	Long:  "`registry`",
 | |
| 	Run: func(cmd *cobra.Command, args []string) {
 | |
| 		if showVersion {
 | |
| 			version.PrintVersion()
 | |
| 			return
 | |
| 		}
 | |
| 		cmd.Usage()
 | |
| 	},
 | |
| }
 | |
| 
 | |
| var (
 | |
| 	dryRun         bool
 | |
| 	removeUntagged bool
 | |
| )
 | |
| 
 | |
| // GCCmd is the cobra command that corresponds to the garbage-collect subcommand
 | |
| var GCCmd = &cobra.Command{
 | |
| 	Use:   "garbage-collect <config>",
 | |
| 	Short: "`garbage-collect` deletes layers not referenced by any manifests",
 | |
| 	Long:  "`garbage-collect` deletes layers not referenced by any manifests",
 | |
| 	Run: func(cmd *cobra.Command, args []string) {
 | |
| 		config, err := resolveConfiguration(args)
 | |
| 		if err != nil {
 | |
| 			fmt.Fprintf(os.Stderr, "configuration error: %v\n", err)
 | |
| 			cmd.Usage()
 | |
| 			os.Exit(1)
 | |
| 		}
 | |
| 
 | |
| 		driver, err := factory.Create(config.Storage.Type(), config.Storage.Parameters())
 | |
| 		if err != nil {
 | |
| 			fmt.Fprintf(os.Stderr, "failed to construct %s driver: %v", config.Storage.Type(), err)
 | |
| 			os.Exit(1)
 | |
| 		}
 | |
| 
 | |
| 		ctx := dcontext.Background()
 | |
| 		ctx, err = configureLogging(ctx, config)
 | |
| 		if err != nil {
 | |
| 			fmt.Fprintf(os.Stderr, "unable to configure logging with config: %s", err)
 | |
| 			os.Exit(1)
 | |
| 		}
 | |
| 
 | |
| 		k, err := libtrust.GenerateECP256PrivateKey()
 | |
| 		if err != nil {
 | |
| 			fmt.Fprint(os.Stderr, err)
 | |
| 			os.Exit(1)
 | |
| 		}
 | |
| 
 | |
| 		registry, err := storage.NewRegistry(ctx, driver, storage.Schema1SigningKey(k))
 | |
| 		if err != nil {
 | |
| 			fmt.Fprintf(os.Stderr, "failed to construct registry: %v", err)
 | |
| 			os.Exit(1)
 | |
| 		}
 | |
| 
 | |
| 		err = storage.MarkAndSweep(ctx, driver, registry, storage.GCOpts{
 | |
| 			DryRun:         dryRun,
 | |
| 			RemoveUntagged: removeUntagged,
 | |
| 		})
 | |
| 		if err != nil {
 | |
| 			fmt.Fprintf(os.Stderr, "failed to garbage collect: %v", err)
 | |
| 			os.Exit(1)
 | |
| 		}
 | |
| 	},
 | |
| }
 |