func convertVolumeToMount( volumeSpec string, stackVolumes map[string]composetypes.VolumeConfig, namespace namespace, ) (mount.Mount, error) { var source, target string var mode []string // TODO: split Windows path mappings properly parts := strings.SplitN(volumeSpec, ":", 3) switch len(parts) { case 3: source = parts[0] target = parts[1] mode = strings.Split(parts[2], ",") case 2: source = parts[0] target = parts[1] case 1: target = parts[0] default: return mount.Mount{}, fmt.Errorf("invald volume: %s", volumeSpec) } // TODO: catch Windows paths here if strings.HasPrefix(source, "/") { return mount.Mount{ Type: mount.TypeBind, Source: source, Target: target, ReadOnly: isReadOnly(mode), BindOptions: getBindOptions(mode), }, nil } stackVolume, exists := stackVolumes[source] if !exists { return mount.Mount{}, fmt.Errorf("undefined volume: %s", source) } var volumeOptions *mount.VolumeOptions if stackVolume.External.Name != "" { source = stackVolume.External.Name } else { volumeOptions = &mount.VolumeOptions{ Labels: stackVolume.Labels, NoCopy: isNoCopy(mode), } if stackVolume.Driver != "" { volumeOptions.DriverConfig = &mount.Driver{ Name: stackVolume.Driver, Options: stackVolume.DriverOpts, } } source = namespace.scope(source) } return mount.Mount{ Type: mount.TypeVolume, Source: source, Target: target, ReadOnly: isReadOnly(mode), VolumeOptions: volumeOptions, }, nil }
func convertVolumeToMount(volumeSpec string, stackVolumes volumes, namespace Namespace) (mount.Mount, error) { var source, target string var mode []string // TODO: split Windows path mappings properly parts := strings.SplitN(volumeSpec, ":", 3) for _, part := range parts { if strings.TrimSpace(part) == "" { return mount.Mount{}, fmt.Errorf("invalid volume: %s", volumeSpec) } } switch len(parts) { case 3: source = parts[0] target = parts[1] mode = strings.Split(parts[2], ",") case 2: source = parts[0] target = parts[1] case 1: target = parts[0] } if source == "" { // Anonymous volume return mount.Mount{ Type: mount.TypeVolume, Target: target, }, nil } // TODO: catch Windows paths here if strings.HasPrefix(source, "/") { return mount.Mount{ Type: mount.TypeBind, Source: source, Target: target, ReadOnly: isReadOnly(mode), BindOptions: getBindOptions(mode), }, nil } stackVolume, exists := stackVolumes[source] if !exists { return mount.Mount{}, fmt.Errorf("undefined volume: %s", source) } var volumeOptions *mount.VolumeOptions if stackVolume.External.Name != "" { source = stackVolume.External.Name } else { volumeOptions = &mount.VolumeOptions{ Labels: AddStackLabel(namespace, stackVolume.Labels), NoCopy: isNoCopy(mode), } if stackVolume.Driver != "" { volumeOptions.DriverConfig = &mount.Driver{ Name: stackVolume.Driver, Options: stackVolume.DriverOpts, } } source = namespace.Scope(source) } return mount.Mount{ Type: mount.TypeVolume, Source: source, Target: target, ReadOnly: isReadOnly(mode), VolumeOptions: volumeOptions, }, nil }