| package mounts // import "github.com/docker/docker/volume/mounts" |
| |
| import ( |
| "errors" |
| "fmt" |
| "path" |
| "regexp" |
| "strings" |
| |
| "github.com/docker/docker/api/types/mount" |
| ) |
| |
| // NewLCOWParser creates a parser with Linux Containers on Windows semantics. |
| func NewLCOWParser() Parser { |
| return &lcowParser{ |
| windowsParser{ |
| fi: defaultFileInfoProvider{}, |
| }, |
| } |
| } |
| |
| // rxLCOWDestination is the regex expression for the mount destination for LCOW |
| // |
| // Destination (aka container path): |
| // - Variation on hostdir but can be a drive followed by colon as well |
| // - If a path, must be absolute. Can include spaces |
| // - Drive cannot be c: (explicitly checked in code, not RegEx) |
| const rxLCOWDestination = `(?P<destination>/(?:[^\\/:*?"<>\r\n]+[/]?)*)` |
| |
| var ( |
| lcowMountDestinationRegex = regexp.MustCompile(`^` + rxLCOWDestination + `$`) |
| lcowSplitRawSpec = regexp.MustCompile(`^` + rxSource + rxLCOWDestination + rxMode + `$`) |
| ) |
| |
| var lcowValidators mountValidator = func(m *mount.Mount) error { |
| if path.Clean(m.Target) == "/" { |
| return ErrVolumeTargetIsRoot |
| } |
| if m.Type == mount.TypeNamedPipe { |
| return errors.New("Linux containers on Windows do not support named pipe mounts") |
| } |
| if !lcowMountDestinationRegex.MatchString(strings.ToLower(m.Target)) { |
| return fmt.Errorf("invalid mount path: '%s'", m.Target) |
| } |
| return nil |
| } |
| |
| type lcowParser struct { |
| windowsParser |
| } |
| |
| func (p *lcowParser) ValidateMountConfig(mnt *mount.Mount) error { |
| return p.validateMountConfigReg(mnt, lcowValidators) |
| } |
| |
| func (p *lcowParser) ParseMountRaw(raw, volumeDriver string) (*MountPoint, error) { |
| arr, err := p.splitRawSpec(raw, lcowSplitRawSpec) |
| if err != nil { |
| return nil, err |
| } |
| return p.parseMount(arr, raw, volumeDriver, false, lcowValidators) |
| } |
| |
| func (p *lcowParser) ParseMountSpec(cfg mount.Mount) (*MountPoint, error) { |
| return p.parseMountSpec(cfg, false, lcowValidators) |
| } |