diff options
author | Daniel J Walsh <dwalsh@redhat.com> | 2018-08-10 14:46:59 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-08-10 21:18:19 +0000 |
commit | 92e9d7891e2d68b119936509e780f3a3d93d8780 (patch) | |
tree | 6ff6f8a39f51cb5e365704a48bde49e8265853d7 /libpod/util.go | |
parent | 8b2d38ee842775fe6bbd72c166eaaceec91c2a65 (diff) | |
download | podman-92e9d7891e2d68b119936509e780f3a3d93d8780.tar.gz podman-92e9d7891e2d68b119936509e780f3a3d93d8780.tar.bz2 podman-92e9d7891e2d68b119936509e780f3a3d93d8780.zip |
We need to sort mounts so that one mount does not over mount another.
Currently we add mounts from images, volumes and internal.
We can accidently over mount an existing mount. This patch sorts the mounts
to make sure a parent directory is always mounted before its content.
Had to change the default propagation on image volume mounts from shared
to private to stop mount points from leaking out of the container.
Also switched from using some docker/docker/pkg to container/storage/pkg
to remove some dependencies on Docker.
Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
Closes: #1243
Approved by: mheon
Diffstat (limited to 'libpod/util.go')
-rw-r--r-- | libpod/util.go | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/libpod/util.go b/libpod/util.go index 106dd4666..13235059f 100644 --- a/libpod/util.go +++ b/libpod/util.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path/filepath" + "sort" "strconv" "strings" "time" @@ -121,3 +122,26 @@ func WaitForFile(path string, timeout time.Duration) error { return errors.Wrapf(ErrInternal, "timed out waiting for file %s", path) } } + +type byDestination []spec.Mount + +func (m byDestination) Len() int { + return len(m) +} + +func (m byDestination) Less(i, j int) bool { + return m.parts(i) < m.parts(j) +} + +func (m byDestination) Swap(i, j int) { + m[i], m[j] = m[j], m[i] +} + +func (m byDestination) parts(i int) int { + return strings.Count(filepath.Clean(m[i].Destination), string(os.PathSeparator)) +} + +func sortMounts(m []spec.Mount) []spec.Mount { + sort.Sort(byDestination(m)) + return m +} |