package main import ( "context" "fmt" "os" "os/signal" "syscall" "time" "github.com/distribution/distribution/v3/configuration" "github.com/distribution/distribution/v3/registry" _ "github.com/distribution/distribution/v3/registry/auth/htpasswd" _ "github.com/distribution/distribution/v3/registry/storage/driver/inmemory" "github.com/phayes/freeport" ) func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Registry config config := &configuration.Configuration{} port, err := freeport.GetFreePort() if err != nil { panic(fmt.Errorf("failed to get free port: %s", err)) } dockerReg := fmt.Sprintf("localhost:%d", port) config.HTTP.Addr = fmt.Sprintf("127.0.0.1:%d", port) config.HTTP.DrainTimeout = time.Duration(10) * time.Second config.Storage = map[string]configuration.Parameters{"inmemory": map[string]interface{}{}} dockerRegistry, err := registry.NewRegistry(ctx, config) if err != nil { panic(fmt.Errorf("failed to create docker registry: %w", err)) } c := make(chan os.Signal, 2) signal.Notify(c, os.Interrupt, syscall.SIGTERM) // Start Docker registry go dockerRegistry.ListenAndServe() fmt.Println("registry server started at:", dockerReg) <-c fmt.Println("shutting down the registry server") }