go run fileserver/main.go /YOUR/Storage/path
go run github.com/kofj/distribution/cmd/registry/main.go config-dev.yml
| # github.com/kofj/distribution/cmd/registry/ | |
| version: 0.1 | |
| log: | |
| level: debug | |
| fields: | |
| service: registry | |
| environment: development | |
| storage: | |
| delete: | |
| enabled: true | |
| cache: | |
| blobdescriptor: redis | |
| filesystem: | |
| rootdirectory: ./devdata | |
| maintenance: | |
| uploadpurging: | |
| enabled: false | |
| http: | |
| addr: :5000 | |
| debug: | |
| addr: :5001 | |
| prometheus: | |
| enabled: true | |
| path: /metrics | |
| headers: | |
| X-Content-Type-Options: [nosniff] | |
| redis: | |
| addr: host.docker.internal:6379 | |
| pool: | |
| maxidle: 16 | |
| maxactive: 64 | |
| idletimeout: 300s | |
| dialtimeout: 10ms | |
| readtimeout: 10ms | |
| writetimeout: 10ms | |
| middleware: | |
| storage: | |
| - name: fileserver | |
| options: | |
| baseurl: http://10.254.57.46:8001 | |
| test: abc |
| // fileserver/main.go | |
| package main | |
| import ( | |
| "os" | |
| "github.com/gin-gonic/gin" | |
| ) | |
| func main() { | |
| if len(os.Args) < 2 { | |
| os.Exit(1) | |
| } | |
| var relativePath = os.Args[1] | |
| var r = gin.Default() | |
| r.Static("/", relativePath) | |
| r.Run(":8001") | |
| } |
| // github.com/docker/distribution/registry/storage/driver/middleware/fileserver/middleware.go | |
| package fileserver | |
| import ( | |
| "context" | |
| "fmt" | |
| "net/url" | |
| "strings" | |
| dcontext "github.com/docker/distribution/context" | |
| storagedriver "github.com/docker/distribution/registry/storage/driver" | |
| storagemiddleware "github.com/docker/distribution/registry/storage/driver/middleware" | |
| ) | |
| type fileServerStorageMiddleware struct { | |
| storagedriver.StorageDriver | |
| baseURL string | |
| } | |
| var _ storagedriver.StorageDriver = &fileServerStorageMiddleware{} | |
| func newFileServerStorageMiddleware(storageDriver storagedriver.StorageDriver, options map[string]interface{}) (sd storagedriver.StorageDriver, err error) { | |
| base, ok := options["baseurl"] | |
| if !ok { | |
| return nil, fmt.Errorf("no baseurl provided") | |
| } | |
| baseURL, ok := base.(string) | |
| if !ok { | |
| return nil, fmt.Errorf("baseurl must be a string") | |
| } | |
| if !strings.Contains(baseURL, "://") { | |
| baseURL = "https://" + baseURL | |
| } | |
| if _, err := url.Parse(baseURL); err != nil { | |
| return nil, fmt.Errorf("invalid baseurl: %v", err) | |
| } | |
| return &fileServerStorageMiddleware{ | |
| StorageDriver: storageDriver, | |
| baseURL: baseURL, | |
| }, nil | |
| } | |
| // URLFor attempts to find a url which may be used to retrieve the file at the given path. | |
| func (fs *fileServerStorageMiddleware) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { | |
| var fullurl = fs.baseURL + path | |
| method, ok := options["method"] | |
| if !ok { | |
| return "", fmt.Errorf("no method provided") | |
| } | |
| methodStr, ok := method.(string) | |
| if !ok { | |
| return "", fmt.Errorf("method must be a string") | |
| } | |
| if methodStr != "GET" && methodStr != "HEAD" { | |
| return "", nil | |
| } | |
| dcontext.GetLogger(ctx).Debugf("[FileServer] name=%s\t path=%s\t method=%s\n", fs.Name(), path, methodStr) | |
| return fullurl, nil | |
| } | |
| // init registers the alicdn layerHandler backend. | |
| func init() { | |
| storagemiddleware.Register("fileserver", storagemiddleware.InitFunc(newFileServerStorageMiddleware)) | |
| } |
| // github.com/kofj/distribution/cmd/registry/main.go | |
| package main | |
| import ( | |
| _ "net/http/pprof" | |
| "github.com/docker/distribution/registry" | |
| _ "github.com/docker/distribution/registry/auth/htpasswd" | |
| _ "github.com/docker/distribution/registry/auth/silly" | |
| _ "github.com/docker/distribution/registry/auth/token" | |
| _ "github.com/docker/distribution/registry/proxy" | |
| _ "github.com/docker/distribution/registry/storage/driver/azure" | |
| _ "github.com/docker/distribution/registry/storage/driver/filesystem" | |
| _ "github.com/docker/distribution/registry/storage/driver/gcs" | |
| _ "github.com/docker/distribution/registry/storage/driver/inmemory" | |
| _ "github.com/docker/distribution/registry/storage/driver/middleware/alicdn" | |
| _ "github.com/docker/distribution/registry/storage/driver/middleware/cloudfront" | |
| _ "github.com/docker/distribution/registry/storage/driver/middleware/redirect" | |
| # The storage middleware use to redirect HEAD/GET request to fileserver | |
| _ "github.com/docker/distribution/registry/storage/driver/middleware/fileserver" | |
| _ "github.com/docker/distribution/registry/storage/driver/oss" | |
| _ "github.com/docker/distribution/registry/storage/driver/s3-aws" | |
| _ "github.com/docker/distribution/registry/storage/driver/swift" | |
| ) | |
| func main() { | |
| registry.RootCmd.Execute() | |
| } |