Sfoglia il codice sorgente

Merge pull request #22956 from Microsoft/jjh/nonttylogin

Fix bad error doing docker login in from non TTY
Brian Goff 9 anni fa
parent
commit
ff3dc48966
1 ha cambiato i file con 11 aggiunte e 6 eliminazioni
  1. 11 6
      api/client/login.go

+ 11 - 6
api/client/login.go

@@ -41,7 +41,6 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
 	}
 	}
 
 
 	ctx := context.Background()
 	ctx := context.Background()
-
 	var serverAddress string
 	var serverAddress string
 	var isDefaultRegistry bool
 	var isDefaultRegistry bool
 	if len(cmd.Args()) > 0 {
 	if len(cmd.Args()) > 0 {
@@ -50,17 +49,14 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
 		serverAddress = cli.electAuthServer(ctx)
 		serverAddress = cli.electAuthServer(ctx)
 		isDefaultRegistry = true
 		isDefaultRegistry = true
 	}
 	}
-
 	authConfig, err := cli.configureAuth(*flUser, *flPassword, serverAddress, isDefaultRegistry)
 	authConfig, err := cli.configureAuth(*flUser, *flPassword, serverAddress, isDefaultRegistry)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
-
 	response, err := cli.client.RegistryLogin(ctx, authConfig)
 	response, err := cli.client.RegistryLogin(ctx, authConfig)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
-
 	if response.IdentityToken != "" {
 	if response.IdentityToken != "" {
 		authConfig.Password = ""
 		authConfig.Password = ""
 		authConfig.IdentityToken = response.IdentityToken
 		authConfig.IdentityToken = response.IdentityToken
@@ -89,6 +85,17 @@ func (cli *DockerCli) configureAuth(flUser, flPassword, serverAddress string, is
 		return authconfig, err
 		return authconfig, err
 	}
 	}
 
 
+	// Some links documenting this:
+	// - https://code.google.com/archive/p/mintty/issues/56
+	// - https://github.com/docker/docker/issues/15272
+	// - https://mintty.github.io/ (compatibility)
+	// Linux will hit this if you attempt `cat | docker login`, and Windows
+	// will hit this if you attempt docker login from mintty where stdin
+	// is a pipe, not a character based console.
+	if flPassword == "" && !cli.isTerminalIn {
+		return authconfig, fmt.Errorf("Error: Cannot perform an interactive logon from a non TTY device")
+	}
+
 	authconfig.Username = strings.TrimSpace(authconfig.Username)
 	authconfig.Username = strings.TrimSpace(authconfig.Username)
 
 
 	if flUser = strings.TrimSpace(flUser); flUser == "" {
 	if flUser = strings.TrimSpace(flUser); flUser == "" {
@@ -103,11 +110,9 @@ func (cli *DockerCli) configureAuth(flUser, flPassword, serverAddress string, is
 			flUser = authconfig.Username
 			flUser = authconfig.Username
 		}
 		}
 	}
 	}
-
 	if flUser == "" {
 	if flUser == "" {
 		return authconfig, fmt.Errorf("Error: Non-null Username Required")
 		return authconfig, fmt.Errorf("Error: Non-null Username Required")
 	}
 	}
-
 	if flPassword == "" {
 	if flPassword == "" {
 		oldState, err := term.SaveState(cli.inFd)
 		oldState, err := term.SaveState(cli.inFd)
 		if err != nil {
 		if err != nil {