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  }