...

Package registry

import "github.com/docker/distribution/registry"
Overview
Index
Subdirectories

Overview ▾

Package registry provides the main entrypoints for running a registry.

Variables

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)
        }
    },
}

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()
    },
}

ServeCmd is a cobra command for running the registry.

var ServeCmd = &cobra.Command{
    Use:   "serve <config>",
    Short: "`serve` stores and distributes Docker images",
    Long:  "`serve` stores and distributes Docker images.",
    Run: func(cmd *cobra.Command, args []string) {

        ctx := dcontext.WithVersion(dcontext.Background(), version.Version)

        config, err := resolveConfiguration(args)
        if err != nil {
            fmt.Fprintf(os.Stderr, "configuration error: %v\n", err)
            cmd.Usage()
            os.Exit(1)
        }

        if config.HTTP.Debug.Addr != "" {
            go func(addr string) {
                log.Infof("debug server listening %v", addr)
                if err := http.ListenAndServe(addr, nil); err != nil {
                    log.Fatalf("error listening on debug interface: %v", err)
                }
            }(config.HTTP.Debug.Addr)
        }

        registry, err := NewRegistry(ctx, config)
        if err != nil {
            log.Fatalln(err)
        }

        if config.HTTP.Debug.Prometheus.Enabled {
            path := config.HTTP.Debug.Prometheus.Path
            if path == "" {
                path = "/metrics"
            }
            log.Info("providing prometheus metrics on ", path)
            http.Handle(path, metrics.Handler())
        }

        if err = registry.ListenAndServe(); err != nil {
            log.Fatalln(err)
        }
    },
}

type Registry

A Registry represents a complete instance of the registry. TODO(aaronl): It might make sense for Registry to become an interface.

type Registry struct {
    // contains filtered or unexported fields
}

func NewRegistry

func NewRegistry(ctx context.Context, config *configuration.Configuration) (*Registry, error)

NewRegistry creates a new registry from a context and configuration struct.

func (*Registry) ListenAndServe

func (registry *Registry) ListenAndServe() error

ListenAndServe runs the registry's HTTP server.

Subdirectories

Name Synopsis
..
api
errcode
v2 Package v2 describes routes, urls and the error codes used in the Docker Registry JSON HTTP API V2.
auth Package auth defines a standard interface for request access controllers.
htpasswd Package htpasswd provides a simple authentication scheme that checks for the user credential hash in an htpasswd formatted file in a configuration-determined location.
silly Package silly provides a simple authentication scheme that checks for the existence of an Authorization header and issues access if is present and non-empty.
token
client
auth
challenge
transport
handlers
listener
middleware
registry
repository
proxy
scheduler
storage Package storage contains storage services for use in the registry application.
cache Package cache provides facilities to speed up access to the storage backend.
cachecheck
memory
redis
driver
azure Package azure provides a storagedriver.StorageDriver implementation to store blobs in Microsoft Azure Blob Storage Service.
base Package base provides a base implementation of the storage driver that can be used to implement common checks.
factory
filesystem
gcs Package gcs implements the Google Cloud Storage driver backend.
inmemory
middleware
cloudfront Package middleware - cloudfront wrapper for storage libs N.B. currently only works with S3, not arbitrary sites
redirect
oss Package oss implements the Aliyun OSS Storage driver backend.
s3-aws Package s3 provides a storagedriver.StorageDriver implementation to store blobs in Amazon S3 cloud storage.
swift Package swift provides a storagedriver.StorageDriver implementation to store blobs in Openstack Swift object storage.
testdriver
testsuites