diff options
| author | Phil Estes <estesp@linux.vnet.ibm.com> | 2015-10-08 11:51:41 -0400 |
|---|---|---|
| committer | Phil Estes <estesp@linux.vnet.ibm.com> | 2015-10-09 17:47:37 -0400 |
| commit | 442b45628ee12ebd8e8bd08497896d5fa8eec4bd (patch) | |
| tree | 09847155c9f9d8fa5c73e95b0c08e204c34fba48 /daemon/graphdriver/devmapper | |
| parent | 9a3ab0358ecd657e3754677ff52250fd6cca4422 (diff) | |
| download | docker-442b45628ee12ebd8e8bd08497896d5fa8eec4bd.tar.gz | |
Add user namespace (mapping) support to the Docker engine
Adds support for the daemon to handle user namespace maps as a
per-daemon setting.
Support for handling uid/gid mapping is added to the builder,
archive/unarchive packages and functions, all graphdrivers (except
Windows), and the test suite is updated to handle user namespace daemon
rootgraph changes.
Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com> (github: estesp)
Diffstat (limited to 'daemon/graphdriver/devmapper')
| -rw-r--r-- | daemon/graphdriver/devmapper/deviceset.go | 26 | ||||
| -rw-r--r-- | daemon/graphdriver/devmapper/devmapper_test.go | 2 | ||||
| -rw-r--r-- | daemon/graphdriver/devmapper/driver.go | 25 |
3 files changed, 43 insertions, 10 deletions
diff --git a/daemon/graphdriver/devmapper/deviceset.go b/daemon/graphdriver/devmapper/deviceset.go index 3d2d123358..30386e651c 100644 --- a/daemon/graphdriver/devmapper/deviceset.go +++ b/daemon/graphdriver/devmapper/deviceset.go @@ -19,11 +19,14 @@ import ( "time" "github.com/Sirupsen/logrus" + "github.com/docker/docker/daemon/graphdriver" "github.com/docker/docker/pkg/devicemapper" + "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/mount" "github.com/docker/docker/pkg/parsers" "github.com/docker/docker/pkg/units" + "github.com/opencontainers/runc/libcontainer/label" ) @@ -113,6 +116,8 @@ type DeviceSet struct { BaseDeviceUUID string //save UUID of base device nrDeletedDevices uint //number of deleted devices deletionWorkerTicker *time.Ticker + uidMaps []idtools.IDMap + gidMaps []idtools.IDMap } // DiskUsage contains information about disk usage and is used when reporting Status of a device. @@ -250,7 +255,11 @@ func (devices *DeviceSet) ensureImage(name string, size int64) (string, error) { dirname := devices.loopbackDir() filename := path.Join(dirname, name) - if err := os.MkdirAll(dirname, 0700); err != nil { + uid, gid, err := idtools.GetRootUIDGID(devices.uidMaps, devices.gidMaps) + if err != nil { + return "", err + } + if err := idtools.MkdirAllAs(dirname, 0700, uid, gid); err != nil && !os.IsExist(err) { return "", err } @@ -1448,7 +1457,16 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error { logrus.Warn("Udev sync is not supported. This will lead to unexpected behavior, data loss and errors. For more information, see https://docs.docker.com/reference/commandline/daemon/#daemon-storage-driver-option") } - if err := os.MkdirAll(devices.metadataDir(), 0700); err != nil { + //create the root dir of the devmapper driver ownership to match this + //daemon's remapped root uid/gid so containers can start properly + uid, gid, err := idtools.GetRootUIDGID(devices.uidMaps, devices.gidMaps) + if err != nil { + return err + } + if err := idtools.MkdirAs(devices.root, 0700, uid, gid); err != nil && !os.IsExist(err) { + return err + } + if err := os.MkdirAll(devices.metadataDir(), 0700); err != nil && !os.IsExist(err) { return err } @@ -2230,7 +2248,7 @@ func (devices *DeviceSet) exportDeviceMetadata(hash string) (*deviceMetadata, er } // NewDeviceSet creates the device set based on the options provided. -func NewDeviceSet(root string, doInit bool, options []string) (*DeviceSet, error) { +func NewDeviceSet(root string, doInit bool, options []string, uidMaps, gidMaps []idtools.IDMap) (*DeviceSet, error) { devicemapper.SetDevDir("/dev") devices := &DeviceSet{ @@ -2245,6 +2263,8 @@ func NewDeviceSet(root string, doInit bool, options []string) (*DeviceSet, error thinpBlockSize: defaultThinpBlockSize, deviceIDMap: make([]byte, deviceIDMapSz), deletionWorkerTicker: time.NewTicker(time.Second * 30), + uidMaps: uidMaps, + gidMaps: gidMaps, } foundBlkDiscard := false diff --git a/daemon/graphdriver/devmapper/devmapper_test.go b/daemon/graphdriver/devmapper/devmapper_test.go index 4c466b4238..61577b094f 100644 --- a/daemon/graphdriver/devmapper/devmapper_test.go +++ b/daemon/graphdriver/devmapper/devmapper_test.go @@ -67,7 +67,7 @@ func testChangeLoopBackSize(t *testing.T, delta, expectDataSize, expectMetaDataS d, err := Init(driver.home, []string{ fmt.Sprintf("dm.loopdatasize=%d", defaultDataLoopbackSize+delta), fmt.Sprintf("dm.loopmetadatasize=%d", defaultMetaDataLoopbackSize+delta), - }) + }, nil, nil) if err != nil { t.Fatalf("error creating devicemapper driver: %v", err) } diff --git a/daemon/graphdriver/devmapper/driver.go b/daemon/graphdriver/devmapper/driver.go index 44dab1f965..b312e49410 100644 --- a/daemon/graphdriver/devmapper/driver.go +++ b/daemon/graphdriver/devmapper/driver.go @@ -10,8 +10,10 @@ import ( "strconv" "github.com/Sirupsen/logrus" + "github.com/docker/docker/daemon/graphdriver" "github.com/docker/docker/pkg/devicemapper" + "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/mount" "github.com/docker/docker/pkg/units" ) @@ -28,13 +30,15 @@ func init() { // Driver contains the device set mounted and the home directory type Driver struct { *DeviceSet - home string + home string + uidMaps []idtools.IDMap + gidMaps []idtools.IDMap } var backingFs = "<unknown>" // Init creates a driver with the given home and the set of options. -func Init(home string, options []string) (graphdriver.Driver, error) { +func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) { fsMagic, err := graphdriver.GetFSMagic(home) if err != nil { return nil, err @@ -43,7 +47,7 @@ func Init(home string, options []string) (graphdriver.Driver, error) { backingFs = fsName } - deviceSet, err := NewDeviceSet(home, true, options) + deviceSet, err := NewDeviceSet(home, true, options, uidMaps, gidMaps) if err != nil { return nil, err } @@ -55,9 +59,11 @@ func Init(home string, options []string) (graphdriver.Driver, error) { d := &Driver{ DeviceSet: deviceSet, home: home, + uidMaps: uidMaps, + gidMaps: gidMaps, } - return graphdriver.NewNaiveDiffDriver(d), nil + return graphdriver.NewNaiveDiffDriver(d, uidMaps, gidMaps), nil } func (d *Driver) String() string { @@ -160,8 +166,15 @@ func (d *Driver) Remove(id string) error { func (d *Driver) Get(id, mountLabel string) (string, error) { mp := path.Join(d.home, "mnt", id) + uid, gid, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps) + if err != nil { + return "", err + } // Create the target directories if they don't exist - if err := os.MkdirAll(mp, 0755); err != nil { + if err := idtools.MkdirAllAs(path.Join(d.home, "mnt"), 0755, uid, gid); err != nil && !os.IsExist(err) { + return "", err + } + if err := idtools.MkdirAs(mp, 0755, uid, gid); err != nil && !os.IsExist(err) { return "", err } @@ -171,7 +184,7 @@ func (d *Driver) Get(id, mountLabel string) (string, error) { } rootFs := path.Join(mp, "rootfs") - if err := os.MkdirAll(rootFs, 0755); err != nil { + if err := idtools.MkdirAllAs(rootFs, 0755, uid, gid); err != nil && !os.IsExist(err) { d.DeviceSet.UnmountDevice(id) return "", err } |
