浏览代码

Need to create bind mount volume if it does not exist.

In order to be consistent on creation of volumes for bind mounts
we need to create the source directory if it does not exist and the
user specified he wants it relabeled.

Can not do this lower down the stack, since we are not passing in the
mode fields.

Signed-off-by: Dan Walsh <dwalsh@redhat.com>
Dan Walsh 9 年之前
父节点
当前提交
322cc99c69
共有 3 个文件被更改,包括 12 次插入13 次删除
  1. 0 6
      daemon/volumes.go
  2. 1 1
      daemon/volumes_unix.go
  3. 11 6
      volume/volume.go

+ 0 - 6
daemon/volumes.go

@@ -11,7 +11,6 @@ import (
 	"github.com/docker/docker/volume"
 	"github.com/docker/docker/volume"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 	containertypes "github.com/docker/engine-api/types/container"
 	containertypes "github.com/docker/engine-api/types/container"
-	"github.com/opencontainers/runc/libcontainer/label"
 )
 )
 
 
 var (
 var (
@@ -148,11 +147,6 @@ func (daemon *Daemon) registerMountPoints(container *container.Container, hostCo
 			}
 			}
 		}
 		}
 
 
-		if label.RelabelNeeded(bind.Mode) {
-			if err := label.Relabel(bind.Source, container.MountLabel, label.IsShared(bind.Mode)); err != nil {
-				return err
-			}
-		}
 		binds[bind.Destination] = true
 		binds[bind.Destination] = true
 		mountPoints[bind.Destination] = bind
 		mountPoints[bind.Destination] = bind
 	}
 	}

+ 1 - 1
daemon/volumes_unix.go

@@ -20,7 +20,7 @@ func (daemon *Daemon) setupMounts(c *container.Container) ([]container.Mount, er
 		if err := daemon.lazyInitializeVolume(c.ID, m); err != nil {
 		if err := daemon.lazyInitializeVolume(c.ID, m); err != nil {
 			return nil, err
 			return nil, err
 		}
 		}
-		path, err := m.Setup()
+		path, err := m.Setup(c.MountLabel)
 		if err != nil {
 		if err != nil {
 			return nil, err
 			return nil, err
 		}
 		}

+ 11 - 6
volume/volume.go

@@ -4,9 +4,11 @@ import (
 	"fmt"
 	"fmt"
 	"os"
 	"os"
 	"strings"
 	"strings"
+	"syscall"
 
 
 	"github.com/docker/docker/pkg/stringid"
 	"github.com/docker/docker/pkg/stringid"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/system"
+	"github.com/opencontainers/runc/libcontainer/label"
 )
 )
 
 
 // DefaultDriverName is the driver name used for the driver
 // DefaultDriverName is the driver name used for the driver
@@ -73,7 +75,7 @@ type MountPoint struct {
 
 
 // Setup sets up a mount point by either mounting the volume if it is
 // Setup sets up a mount point by either mounting the volume if it is
 // configured, or creating the source directory if supplied.
 // configured, or creating the source directory if supplied.
-func (m *MountPoint) Setup() (string, error) {
+func (m *MountPoint) Setup(mountLabel string) (string, error) {
 	if m.Volume != nil {
 	if m.Volume != nil {
 		if m.ID == "" {
 		if m.ID == "" {
 			m.ID = stringid.GenerateNonCryptoID()
 			m.ID = stringid.GenerateNonCryptoID()
@@ -84,12 +86,15 @@ func (m *MountPoint) Setup() (string, error) {
 		return "", fmt.Errorf("Unable to setup mount point, neither source nor volume defined")
 		return "", fmt.Errorf("Unable to setup mount point, neither source nor volume defined")
 	}
 	}
 	// system.MkdirAll() produces an error if m.Source exists and is a file (not a directory),
 	// system.MkdirAll() produces an error if m.Source exists and is a file (not a directory),
-	// so first check if the path does not exist
-	if _, err := os.Stat(m.Source); err != nil {
-		if !os.IsNotExist(err) {
-			return "", err
+	if err := system.MkdirAll(m.Source, 0755); err != nil {
+		if perr, ok := err.(*os.PathError); ok {
+			if perr.Err != syscall.ENOTDIR {
+				return "", err
+			}
 		}
 		}
-		if err := system.MkdirAll(m.Source, 0755); err != nil {
+	}
+	if label.RelabelNeeded(m.Mode) {
+		if err := label.Relabel(m.Source, mountLabel, label.IsShared(m.Mode)); err != nil {
 			return "", err
 			return "", err
 		}
 		}
 	}
 	}