summaryrefslogtreecommitdiff
path: root/daemon/graphdriver/devmapper
diff options
context:
space:
mode:
authorPhil Estes <estesp@linux.vnet.ibm.com>2015-10-08 11:51:41 -0400
committerPhil Estes <estesp@linux.vnet.ibm.com>2015-10-09 17:47:37 -0400
commit442b45628ee12ebd8e8bd08497896d5fa8eec4bd (patch)
tree09847155c9f9d8fa5c73e95b0c08e204c34fba48 /daemon/graphdriver/devmapper
parent9a3ab0358ecd657e3754677ff52250fd6cca4422 (diff)
downloaddocker-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.go26
-rw-r--r--daemon/graphdriver/devmapper/devmapper_test.go2
-rw-r--r--daemon/graphdriver/devmapper/driver.go25
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
}