diff --git a/pkg/mount/dag_steps.go b/pkg/mount/dag_steps.go index dcffc6e..3e21a15 100644 --- a/pkg/mount/dag_steps.go +++ b/pkg/mount/dag_steps.go @@ -308,7 +308,7 @@ func (s *State) MountCustomBindsDagStep(g *herd.Graph) error { var err *multierror.Error internalUtils.Log.Debug().Strs("mounts", s.BindMounts).Msg("Mounting binds") - for _, p := range s.BindMounts { + for _, p := range s.SortedBindMounts() { internalUtils.Log.Debug().Str("what", p).Msg("Bind mount start") op := mountBind(p, s.Rootdir, s.StateDir) err2 := op.run() diff --git a/pkg/mount/state.go b/pkg/mount/state.go index 385edc2..45efbeb 100644 --- a/pkg/mount/state.go +++ b/pkg/mount/state.go @@ -6,6 +6,8 @@ import ( "fmt" "os" "path/filepath" + "sort" + "strings" "time" "github.com/containerd/containerd/mount" @@ -31,6 +33,22 @@ type State struct { fstabs []*fstab.Mount } +// SortedBindMounts returns the nodes with less depth first and in alphabetical order. +func (s *State) SortedBindMounts() []string { + bindMountsCopy := s.BindMounts + sort.Slice(bindMountsCopy, func(i, j int) bool { + iAry := strings.Split(bindMountsCopy[i], "/") + jAry := strings.Split(bindMountsCopy[j], "/") + iSize := len(iAry) + jSize := len(jAry) + if iSize == jSize { + return strings.Compare(iAry[len(iAry)-1], jAry[len(jAry)-1]) == -1 + } + return iSize < jSize + }) + return bindMountsCopy +} + func (s *State) path(p ...string) string { return filepath.Join(append([]string{s.Rootdir}, p...)...) } diff --git a/pkg/mount/state_test.go b/pkg/mount/state_test.go index 2c59d3c..e31dad2 100644 --- a/pkg/mount/state_test.go +++ b/pkg/mount/state_test.go @@ -19,6 +19,27 @@ var _ = Describe("mounting immutable setup", func() { Expect(g).ToNot(BeNil()) }) + Context("SortedBindMounts()", func() { + It("returns the nodes with less depth first and in alfabetical order", func() { + s := &mount.State{ + BindMounts: []string{ + "/etc/nginx/config.d/", + "/etc/nginx", + "/etc/kubernetes/child", + "/etc/kubernetes", + "/etc/kubernetes/child/grand-child", + }, + } + Expect(s.SortedBindMounts()).To(Equal([]string{ + "/etc/kubernetes", + "/etc/nginx", + "/etc/kubernetes/child", + "/etc/nginx/config.d/", + "/etc/kubernetes/child/grand-child", + })) + }) + }) + Context("simple invocation", func() { It("generates normal dag", func() { Skip("Cant override bootstate yet")