瀏覽代碼

Honor user passed on container in nsinit
Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)

Michael Crosby 11 年之前
父節點
當前提交
1c79b747bb
共有 2 個文件被更改,包括 33 次插入9 次删除
  1. 25 9
      pkg/libcontainer/nsinit/init.go
  2. 8 0
      pkg/system/calls_linux.go

+ 25 - 9
pkg/libcontainer/nsinit/init.go

@@ -8,6 +8,7 @@ import (
 	"github.com/dotcloud/docker/pkg/libcontainer/capabilities"
 	"github.com/dotcloud/docker/pkg/libcontainer/network"
 	"github.com/dotcloud/docker/pkg/system"
+	"github.com/dotcloud/docker/pkg/user"
 	"log"
 	"os"
 	"os/exec"
@@ -110,15 +111,30 @@ func resolveRootfs(uncleanRootfs string) (string, error) {
 }
 
 func setupUser(container *libcontainer.Container) error {
-	// TODO: honor user passed on container
-	if err := system.Setgroups(nil); err != nil {
-		return err
-	}
-	if err := system.Setresgid(0, 0, 0); err != nil {
-		return err
-	}
-	if err := system.Setresuid(0, 0, 0); err != nil {
-		return err
+	if container.User != "" {
+		uid, gid, suppGids, err := user.GetUserGroupSupplementary(container.User, syscall.Getuid(), syscall.Getgid())
+		if err != nil {
+			return err
+		}
+		if err := system.Setgroups(suppGids); err != nil {
+			return err
+		}
+		if err := system.Setgid(gid); err != nil {
+			return err
+		}
+		if err := system.Setuid(uid); err != nil {
+			return err
+		}
+	} else {
+		if err := system.Setgroups(nil); err != nil {
+			return err
+		}
+		if err := system.Setresgid(0, 0, 0); err != nil {
+			return err
+		}
+		if err := system.Setresuid(0, 0, 0); err != nil {
+			return err
+		}
 	}
 	return nil
 }

+ 8 - 0
pkg/system/calls_linux.go

@@ -71,6 +71,14 @@ func Setresuid(ruid, euid, suid int) error {
 	return syscall.Setresuid(ruid, euid, suid)
 }
 
+func Setgid(gid int) error {
+	return syscall.Setgid(gid)
+}
+
+func Setuid(uid int) error {
+	return syscall.Setuid(uid)
+}
+
 func Sethostname(name string) error {
 	return syscall.Sethostname([]byte(name))
 }