瀏覽代碼

Merge pull request #20572 from runcom/sudo-user

resolve the config file from the sudo user
Vincent Demeester 9 年之前
父節點
當前提交
61d24e769d
共有 4 個文件被更改,包括 30 次插入3 次删除
  1. 13 2
      cliconfig/config.go
  2. 3 0
      docs/reference/commandline/cli.md
  3. 1 1
      image/v1/imagev1.go
  4. 13 0
      pkg/homedir/homedir.go

+ 13 - 2
cliconfig/config.go

@@ -29,9 +29,20 @@ var (
 	configDir = os.Getenv("DOCKER_CONFIG")
 	configDir = os.Getenv("DOCKER_CONFIG")
 )
 )
 
 
+func getDefaultConfigDir(confFile string) string {
+	confDir := filepath.Join(homedir.Get(), confFile)
+	// if the directory doesn't exist, maybe we called docker with sudo
+	if _, err := os.Stat(configDir); err != nil {
+		if os.IsNotExist(err) {
+			return filepath.Join(homedir.GetWithSudoUser(), confFile)
+		}
+	}
+	return confDir
+}
+
 func init() {
 func init() {
 	if configDir == "" {
 	if configDir == "" {
-		configDir = filepath.Join(homedir.Get(), ".docker")
+		configDir = getDefaultConfigDir(".docker")
 	}
 	}
 }
 }
 
 
@@ -178,7 +189,7 @@ func Load(configDir string) (*ConfigFile, error) {
 	}
 	}
 
 
 	// Can't find latest config file so check for the old one
 	// Can't find latest config file so check for the old one
-	confFile := filepath.Join(homedir.Get(), oldConfigfile)
+	confFile := getDefaultConfigDir(oldConfigfile)
 	if _, err := os.Stat(confFile); err != nil {
 	if _, err := os.Stat(confFile); err != nil {
 		return &configFile, nil //missing file is not an error
 		return &configFile, nil //missing file is not an error
 	}
 	}

+ 3 - 0
docs/reference/commandline/cli.md

@@ -78,6 +78,9 @@ For example:
 Instructs Docker to use the configuration files in your `~/testconfigs/`
 Instructs Docker to use the configuration files in your `~/testconfigs/`
 directory when running the `ps` command.
 directory when running the `ps` command.
 
 
+> **Note**: If you run docker commands with `sudo`, Docker first looks for a configuration
+> file in `/root/.docker/`, before looking in `~/.docker/` for the user that did the sudo call.
+
 Docker manages most of the files in the configuration directory
 Docker manages most of the files in the configuration directory
 and you should not modify them. However, you *can modify* the
 and you should not modify them. However, you *can modify* the
 `config.json` file to control certain aspects of how the `docker`
 `config.json` file to control certain aspects of how the `docker`

+ 1 - 1
image/v1/imagev1.go

@@ -142,7 +142,7 @@ func rawJSON(value interface{}) *json.RawMessage {
 // ValidateID checks whether an ID string is a valid image ID.
 // ValidateID checks whether an ID string is a valid image ID.
 func ValidateID(id string) error {
 func ValidateID(id string) error {
 	if ok := validHex.MatchString(id); !ok {
 	if ok := validHex.MatchString(id); !ok {
-		return fmt.Errorf("image ID '%s' is invalid ", id)
+		return fmt.Errorf("image ID %q is invalid", id)
 	}
 	}
 	return nil
 	return nil
 }
 }

+ 13 - 0
pkg/homedir/homedir.go

@@ -29,6 +29,19 @@ func Get() string {
 	return home
 	return home
 }
 }
 
 
+// GetWithSudoUser returns the home directory of the user who called sudo (if
+// available, retrieved from $SUDO_USER). It fallbacks to Get if any error occurs.
+// Returned path should be used with "path/filepath" to form new paths.
+func GetWithSudoUser() string {
+	sudoUser := os.Getenv("SUDO_USER")
+	if sudoUser != "" {
+		if user, err := user.LookupUser(sudoUser); err == nil {
+			return user.Home
+		}
+	}
+	return Get()
+}
+
 // GetShortcutString returns the string that is shortcut to user's home directory
 // GetShortcutString returns the string that is shortcut to user's home directory
 // in the native shell of the platform running on.
 // in the native shell of the platform running on.
 func GetShortcutString() string {
 func GetShortcutString() string {