github.com/45cali/docker@v1.11.1/volume/local/local_unix.go (about)

     1  // +build linux freebsd
     2  
     3  // Package local provides the default implementation for volumes. It
     4  // is used to mount data volume containers and directories local to
     5  // the host server.
     6  package local
     7  
     8  import (
     9  	"fmt"
    10  	"path/filepath"
    11  	"strings"
    12  
    13  	"github.com/docker/docker/pkg/mount"
    14  )
    15  
    16  var (
    17  	oldVfsDir = filepath.Join("vfs", "dir")
    18  
    19  	validOpts = map[string]bool{
    20  		"type":   true, // specify the filesystem type for mount, e.g. nfs
    21  		"o":      true, // generic mount options
    22  		"device": true, // device to mount from
    23  	}
    24  )
    25  
    26  type optsConfig struct {
    27  	MountType   string
    28  	MountOpts   string
    29  	MountDevice string
    30  }
    31  
    32  // scopedPath verifies that the path where the volume is located
    33  // is under Docker's root and the valid local paths.
    34  func (r *Root) scopedPath(realPath string) bool {
    35  	// Volumes path for Docker version >= 1.7
    36  	if strings.HasPrefix(realPath, filepath.Join(r.scope, volumesPathName)) && realPath != filepath.Join(r.scope, volumesPathName) {
    37  		return true
    38  	}
    39  
    40  	// Volumes path for Docker version < 1.7
    41  	if strings.HasPrefix(realPath, filepath.Join(r.scope, oldVfsDir)) {
    42  		return true
    43  	}
    44  
    45  	return false
    46  }
    47  
    48  func setOpts(v *localVolume, opts map[string]string) error {
    49  	if len(opts) == 0 {
    50  		return nil
    51  	}
    52  	if err := validateOpts(opts); err != nil {
    53  		return err
    54  	}
    55  
    56  	v.opts = &optsConfig{
    57  		MountType:   opts["type"],
    58  		MountOpts:   opts["o"],
    59  		MountDevice: opts["device"],
    60  	}
    61  	return nil
    62  }
    63  
    64  func (v *localVolume) mount() error {
    65  	if v.opts.MountDevice == "" {
    66  		return fmt.Errorf("missing device in volume options")
    67  	}
    68  	return mount.Mount(v.opts.MountDevice, v.path, v.opts.MountType, v.opts.MountOpts)
    69  }