Merge pull request #5748 from crosbymichael/libcontainer-bindmounts

libcontainer: Create dirs/files as needed for bind mounts
This commit is contained in:
Michael Crosby 2014-05-12 12:27:18 -07:00
commit fa0e7c2ec2

View file

@ -91,6 +91,28 @@ func mountSystem(rootfs string, container *libcontainer.Container) error {
return nil return nil
} }
func createIfNotExists(path string, isDir bool) error {
if _, err := os.Stat(path); err != nil {
if os.IsNotExist(err) {
if isDir {
if err := os.MkdirAll(path, 0755); err != nil {
return err
}
} else {
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
return err
}
f, err := os.OpenFile(path, os.O_CREATE, 0755)
if err != nil {
return err
}
f.Close()
}
}
}
return nil
}
func setupBindmounts(rootfs string, bindMounts libcontainer.Mounts) error { func setupBindmounts(rootfs string, bindMounts libcontainer.Mounts) error {
for _, m := range bindMounts.OfType("bind") { for _, m := range bindMounts.OfType("bind") {
var ( var (
@ -100,6 +122,15 @@ func setupBindmounts(rootfs string, bindMounts libcontainer.Mounts) error {
if !m.Writable { if !m.Writable {
flags = flags | syscall.MS_RDONLY flags = flags | syscall.MS_RDONLY
} }
stat, err := os.Stat(m.Source)
if err != nil {
return err
}
if err := createIfNotExists(dest, stat.IsDir()); err != nil {
return fmt.Errorf("Creating new bind-mount target, %s", err)
}
if err := system.Mount(m.Source, dest, "bind", uintptr(flags), ""); err != nil { if err := system.Mount(m.Source, dest, "bind", uintptr(flags), ""); err != nil {
return fmt.Errorf("mounting %s into %s %s", m.Source, dest, err) return fmt.Errorf("mounting %s into %s %s", m.Source, dest, err)
} }