Merge pull request #6221 from crosbymichael/no-unmount

Move remount as private to the graph drivers
This commit is contained in:
Michael Crosby 2014-06-05 16:51:10 -07:00
commit c239c8ad9d
5 changed files with 51 additions and 29 deletions

View File

@ -27,7 +27,6 @@ import (
"github.com/dotcloud/docker/image" "github.com/dotcloud/docker/image"
"github.com/dotcloud/docker/pkg/graphdb" "github.com/dotcloud/docker/pkg/graphdb"
"github.com/dotcloud/docker/pkg/label" "github.com/dotcloud/docker/pkg/label"
"github.com/dotcloud/docker/pkg/mount"
"github.com/dotcloud/docker/pkg/namesgenerator" "github.com/dotcloud/docker/pkg/namesgenerator"
"github.com/dotcloud/docker/pkg/networkfs/resolvconf" "github.com/dotcloud/docker/pkg/networkfs/resolvconf"
"github.com/dotcloud/docker/pkg/selinux" "github.com/dotcloud/docker/pkg/selinux"
@ -102,21 +101,6 @@ func (daemon *Daemon) Install(eng *engine.Engine) error {
return eng.Register("container_inspect", daemon.ContainerInspect) return eng.Register("container_inspect", daemon.ContainerInspect)
} }
// Mountpoints should be private to the container
func remountPrivate(mountPoint string) error {
mounted, err := mount.Mounted(mountPoint)
if err != nil {
return err
}
if !mounted {
if err := mount.Mount(mountPoint, mountPoint, "none", "bind,rw"); err != nil {
return err
}
}
return mount.ForceMount("", mountPoint, "none", "private")
}
// List returns an array of all containers registered in the daemon. // List returns an array of all containers registered in the daemon.
func (daemon *Daemon) List() []*Container { func (daemon *Daemon) List() []*Container {
return daemon.containers.List() return daemon.containers.List()
@ -786,10 +770,6 @@ func NewDaemonFromDirectory(config *daemonconfig.Config, eng *engine.Engine) (*D
} }
utils.Debugf("Using graph driver %s", driver) utils.Debugf("Using graph driver %s", driver)
if err := remountPrivate(config.Root); err != nil {
return nil, err
}
daemonRepo := path.Join(config.Root, "containers") daemonRepo := path.Join(config.Root, "containers")
if err := os.MkdirAll(daemonRepo, 0700); err != nil && !os.IsExist(err) { if err := os.MkdirAll(daemonRepo, 0700); err != nil && !os.IsExist(err) {
@ -938,10 +918,6 @@ func (daemon *Daemon) Close() error {
utils.Errorf("daemon.containerGraph.Close(): %s", err.Error()) utils.Errorf("daemon.containerGraph.Close(): %s", err.Error())
errorsStrings = append(errorsStrings, err.Error()) errorsStrings = append(errorsStrings, err.Error())
} }
if err := mount.Unmount(daemon.config.Root); err != nil {
utils.Errorf("daemon.Umount(%s): %s", daemon.config.Root, err.Error())
errorsStrings = append(errorsStrings, err.Error())
}
if len(errorsStrings) > 0 { if len(errorsStrings) > 0 {
return fmt.Errorf("%s", strings.Join(errorsStrings, ", ")) return fmt.Errorf("%s", strings.Join(errorsStrings, ", "))
} }

View File

@ -97,6 +97,10 @@ func Init(root string, options []string) (graphdriver.Driver, error) {
return nil, err return nil, err
} }
if err := graphdriver.MakePrivate(root); err != nil {
return nil, err
}
for _, p := range paths { for _, p := range paths {
if err := os.MkdirAll(path.Join(root, p), 0755); err != nil { if err := os.MkdirAll(path.Join(root, p), 0755); err != nil {
return nil, err return nil, err
@ -371,12 +375,14 @@ func (a *Driver) Cleanup() error {
if err != nil { if err != nil {
return err return err
} }
for _, id := range ids { for _, id := range ids {
if err := a.unmount(id); err != nil { if err := a.unmount(id); err != nil {
utils.Errorf("Unmounting %s: %s", utils.TruncateID(id), err) utils.Errorf("Unmounting %s: %s", utils.TruncateID(id), err)
} }
} }
return nil
return mountpk.Unmount(a.root)
} }
func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err error) { func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err error) {

View File

@ -11,11 +11,13 @@ import "C"
import ( import (
"fmt" "fmt"
"github.com/dotcloud/docker/daemon/graphdriver"
"os" "os"
"path" "path"
"syscall" "syscall"
"unsafe" "unsafe"
"github.com/dotcloud/docker/daemon/graphdriver"
"github.com/dotcloud/docker/pkg/mount"
) )
func init() { func init() {
@ -34,6 +36,14 @@ func Init(home string, options []string) (graphdriver.Driver, error) {
return nil, graphdriver.ErrPrerequisites return nil, graphdriver.ErrPrerequisites
} }
if err := os.MkdirAll(home, 0700); err != nil {
return nil, err
}
if err := graphdriver.MakePrivate(home); err != nil {
return nil, err
}
return &Driver{ return &Driver{
home: home, home: home,
}, nil }, nil
@ -52,7 +62,7 @@ func (d *Driver) Status() [][2]string {
} }
func (d *Driver) Cleanup() error { func (d *Driver) Cleanup() error {
return nil return mount.Unmount(d.home)
} }
func free(p *C.char) { func free(p *C.char) {

View File

@ -9,6 +9,7 @@ import (
"path" "path"
"github.com/dotcloud/docker/daemon/graphdriver" "github.com/dotcloud/docker/daemon/graphdriver"
"github.com/dotcloud/docker/pkg/mount"
"github.com/dotcloud/docker/utils" "github.com/dotcloud/docker/utils"
) )
@ -31,10 +32,16 @@ func Init(home string, options []string) (graphdriver.Driver, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
if err := graphdriver.MakePrivate(home); err != nil {
return nil, err
}
d := &Driver{ d := &Driver{
DeviceSet: deviceSet, DeviceSet: deviceSet,
home: home, home: home,
} }
return d, nil return d, nil
} }
@ -58,7 +65,13 @@ func (d *Driver) Status() [][2]string {
} }
func (d *Driver) Cleanup() error { func (d *Driver) Cleanup() error {
return d.DeviceSet.Shutdown() err := d.DeviceSet.Shutdown()
if err2 := mount.Unmount(d.home); err == nil {
err = err2
}
return err
} }
func (d *Driver) Create(id, parent string) error { func (d *Driver) Create(id, parent string) error {

View File

@ -3,9 +3,11 @@ package graphdriver
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/dotcloud/docker/archive"
"os" "os"
"path" "path"
"github.com/dotcloud/docker/archive"
"github.com/dotcloud/docker/pkg/mount"
) )
type FsMagic uint64 type FsMagic uint64
@ -107,3 +109,18 @@ func New(root string, options []string) (driver Driver, err error) {
} }
return nil, fmt.Errorf("No supported storage backend found") return nil, fmt.Errorf("No supported storage backend found")
} }
func MakePrivate(mountPoint string) error {
mounted, err := mount.Mounted(mountPoint)
if err != nil {
return err
}
if !mounted {
if err := mount.Mount(mountPoint, mountPoint, "none", "bind,rw"); err != nil {
return err
}
}
return mount.ForceMount("", mountPoint, "none", "private")
}