github.com/artpar/rclone@v1.67.3/cmd/serve/docker/docker.go (about) 1 // Package docker serves a remote suitable for use with docker volume api 2 package docker 3 4 import ( 5 "context" 6 _ "embed" 7 "path/filepath" 8 "strings" 9 "syscall" 10 11 "github.com/spf13/cobra" 12 13 "github.com/artpar/rclone/cmd" 14 "github.com/artpar/rclone/cmd/mountlib" 15 "github.com/artpar/rclone/fs/config/flags" 16 "github.com/artpar/rclone/vfs" 17 "github.com/artpar/rclone/vfs/vfsflags" 18 ) 19 20 var ( 21 pluginName = "rclone" 22 pluginScope = "local" 23 baseDir = "/var/lib/docker-volumes/rclone" 24 sockDir = "/run/docker/plugins" //lint:ignore U1000 unused when not building linux 25 defSpecDir = "/etc/docker/plugins" 26 stateFile = "docker-plugin.state" 27 socketAddr = "" // TCP listening address or empty string for Unix socket 28 socketGid = syscall.Getgid() 29 canPersist = false // allows writing to config file 30 forgetState = false 31 noSpec = false 32 ) 33 34 //go:embed docker.md 35 var longHelp string 36 37 // help returns the help string cleaned up to simplify appending 38 func help() string { 39 return strings.TrimSpace(longHelp) + "\n\n" 40 } 41 42 func init() { 43 cmdFlags := Command.Flags() 44 // Add command specific flags 45 flags.StringVarP(cmdFlags, &baseDir, "base-dir", "", baseDir, "Base directory for volumes", "") 46 flags.StringVarP(cmdFlags, &socketAddr, "socket-addr", "", socketAddr, "Address <host:port> or absolute path (default: /run/docker/plugins/rclone.sock)", "") 47 flags.IntVarP(cmdFlags, &socketGid, "socket-gid", "", socketGid, "GID for unix socket (default: current process GID)", "") 48 flags.BoolVarP(cmdFlags, &forgetState, "forget-state", "", forgetState, "Skip restoring previous state", "") 49 flags.BoolVarP(cmdFlags, &noSpec, "no-spec", "", noSpec, "Do not write spec file", "") 50 // Add common mount/vfs flags 51 mountlib.AddFlags(cmdFlags) 52 vfsflags.AddFlags(cmdFlags) 53 } 54 55 // Command definition for cobra 56 var Command = &cobra.Command{ 57 Use: "docker", 58 Short: `Serve any remote on docker's volume plugin API.`, 59 Long: help() + vfs.Help(), 60 Annotations: map[string]string{ 61 "versionIntroduced": "v1.56", 62 "groups": "Filter", 63 }, 64 Run: func(command *cobra.Command, args []string) { 65 cmd.CheckArgs(0, 0, command, args) 66 cmd.Run(false, false, command, func() error { 67 ctx := context.Background() 68 drv, err := NewDriver(ctx, baseDir, nil, nil, false, forgetState) 69 if err != nil { 70 return err 71 } 72 srv := NewServer(drv) 73 if socketAddr == "" { 74 // Listen on unix socket at /run/docker/plugins/<pluginName>.sock 75 return srv.ServeUnix(pluginName, socketGid) 76 } 77 if filepath.IsAbs(socketAddr) { 78 // Listen on unix socket at given path 79 return srv.ServeUnix(socketAddr, socketGid) 80 } 81 return srv.ServeTCP(socketAddr, "", nil, noSpec) 82 }) 83 }, 84 }