فهرست منبع

Merge pull request #5913 from crosbymichael/fuse

Make sure dev/fuse is created in container
Guillaume J. Charmes 11 سال پیش
والد
کامیت
2d1c245631
2فایلهای تغییر یافته به همراه23 افزوده شده و 6 حذف شده
  1. 4 1
      pkg/libcontainer/mount/init.go
  2. 19 5
      pkg/libcontainer/mount/nodes/nodes.go

+ 4 - 1
pkg/libcontainer/mount/init.go

@@ -48,9 +48,12 @@ func InitializeMountNamespace(rootfs, console string, container *libcontainer.Co
 	if err := setupBindmounts(rootfs, container.Mounts); err != nil {
 		return fmt.Errorf("bind mounts %s", err)
 	}
-	if err := nodes.CopyN(rootfs, nodes.DefaultNodes); err != nil {
+	if err := nodes.CopyN(rootfs, nodes.DefaultNodes, true); err != nil {
 		return fmt.Errorf("copy dev nodes %s", err)
 	}
+	if err := nodes.CopyN(rootfs, nodes.AdditionalNodes, false); err != nil {
+		return fmt.Errorf("copy additional dev nodes %s", err)
+	}
 	if err := SetupPtmx(rootfs, console, container.Context["mount_label"]); err != nil {
 		return err
 	}

+ 19 - 5
pkg/libcontainer/mount/nodes/nodes.go

@@ -4,10 +4,11 @@ package nodes
 
 import (
 	"fmt"
-	"github.com/dotcloud/docker/pkg/system"
 	"os"
 	"path/filepath"
 	"syscall"
+
+	"github.com/dotcloud/docker/pkg/system"
 )
 
 // Default list of device nodes to copy
@@ -20,30 +21,43 @@ var DefaultNodes = []string{
 	"tty",
 }
 
+// AdditionalNodes includes nodes that are not required
+var AdditionalNodes = []string{
+	"fuse",
+}
+
 // CopyN copies the device node from the host into the rootfs
-func CopyN(rootfs string, nodesToCopy []string) error {
+func CopyN(rootfs string, nodesToCopy []string, shouldExist bool) error {
 	oldMask := system.Umask(0000)
 	defer system.Umask(oldMask)
 
 	for _, node := range nodesToCopy {
-		if err := Copy(rootfs, node); err != nil {
+		if err := Copy(rootfs, node, shouldExist); err != nil {
 			return err
 		}
 	}
 	return nil
 }
 
-func Copy(rootfs, node string) error {
+// Copy copies the device node into the rootfs.  If the node
+// on the host system does not exist and the boolean flag is passed
+// an error will be returned
+func Copy(rootfs, node string, shouldExist bool) error {
 	stat, err := os.Stat(filepath.Join("/dev", node))
 	if err != nil {
+		if os.IsNotExist(err) && !shouldExist {
+			return nil
+		}
 		return err
 	}
+
 	var (
 		dest = filepath.Join(rootfs, "dev", node)
 		st   = stat.Sys().(*syscall.Stat_t)
 	)
+
 	if err := system.Mknod(dest, st.Mode, int(st.Rdev)); err != nil && !os.IsExist(err) {
-		return fmt.Errorf("copy %s %s", node, err)
+		return fmt.Errorf("mknod %s %s", node, err)
 	}
 	return nil
 }