mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
92899ffac8
While it is important to not create controllers for an invalid task, certain properties should only be checked immediately before use. Early host validation of mounts prevents resolution of the task Executor when the mounts are not relevant to execution flow. In this case, we have a check for the existence of a bind mount path in a creation function that prevents a task controller from being resolved. Such early validation prevents one from interacting directly with a controller and result in unnecessary error reporting. In accordance with the above, we move the validation of the existence of host bind mount paths to the `Controller.Start` phase. We also call these "checks", as they are valid mounts but reference non-existent paths. Signed-off-by: Stephen J Day <stephen.day@docker.com>
40 lines
1.1 KiB
Go
40 lines
1.1 KiB
Go
package container
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"path/filepath"
|
|
|
|
"github.com/docker/swarmkit/api"
|
|
)
|
|
|
|
func validateMounts(mounts []api.Mount) error {
|
|
for _, mount := range mounts {
|
|
// Target must always be absolute
|
|
if !filepath.IsAbs(mount.Target) {
|
|
return fmt.Errorf("invalid mount target, must be an absolute path: %s", mount.Target)
|
|
}
|
|
|
|
switch mount.Type {
|
|
// The checks on abs paths are required due to the container API confusing
|
|
// volume mounts as bind mounts when the source is absolute (and vice-versa)
|
|
// See #25253
|
|
// TODO: This is probably not necessary once #22373 is merged
|
|
case api.MountTypeBind:
|
|
if !filepath.IsAbs(mount.Source) {
|
|
return fmt.Errorf("invalid bind mount source, must be an absolute path: %s", mount.Source)
|
|
}
|
|
case api.MountTypeVolume:
|
|
if filepath.IsAbs(mount.Source) {
|
|
return fmt.Errorf("invalid volume mount source, must not be an absolute path: %s", mount.Source)
|
|
}
|
|
case api.MountTypeTmpfs:
|
|
if mount.Source != "" {
|
|
return errors.New("invalid tmpfs source, source must be empty")
|
|
}
|
|
default:
|
|
return fmt.Errorf("invalid mount type: %s", mount.Type)
|
|
}
|
|
}
|
|
return nil
|
|
}
|