github.com/DaoCloud/dao@v0.0.0-20161212064103-c3dbfd13ee36/api/client/registry/login.go (about)

     1  package registry
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"golang.org/x/net/context"
     7  
     8  	"github.com/docker/docker/api/client"
     9  	"github.com/docker/docker/cli"
    10  	"github.com/spf13/cobra"
    11  )
    12  
    13  type loginOptions struct {
    14  	serverAddress string
    15  	user          string
    16  	password      string
    17  	email         string
    18  }
    19  
    20  // NewLoginCommand creates a new `docker login` command
    21  func NewLoginCommand(dockerCli *client.DockerCli) *cobra.Command {
    22  	var opts loginOptions
    23  
    24  	cmd := &cobra.Command{
    25  		Use:   "login [OPTIONS] [SERVER]",
    26  		Short: "登陆一个Docker镜像仓库.",
    27  		Long:  "登陆一个Docker镜像仓库.\n如果没有制定服务器, Docker引擎会采用默认地址.",
    28  		Args:  cli.RequiresMaxArgs(1),
    29  		RunE: func(cmd *cobra.Command, args []string) error {
    30  			if len(args) > 0 {
    31  				opts.serverAddress = args[0]
    32  			}
    33  			return runLogin(dockerCli, opts)
    34  		},
    35  	}
    36  
    37  	flags := cmd.Flags()
    38  
    39  	flags.StringVarP(&opts.user, "username", "u", "", "Username")
    40  	flags.StringVarP(&opts.password, "password", "p", "", "Password")
    41  
    42  	// Deprecated in 1.11: Should be removed in docker 1.13
    43  	flags.StringVarP(&opts.email, "email", "e", "", "Email")
    44  	flags.MarkDeprecated("email", "will be removed in 1.13.")
    45  
    46  	return cmd
    47  }
    48  
    49  func runLogin(dockerCli *client.DockerCli, opts loginOptions) error {
    50  	ctx := context.Background()
    51  	clnt := dockerCli.Client()
    52  
    53  	var serverAddress string
    54  	var isDefaultRegistry bool
    55  	if opts.serverAddress != "" {
    56  		serverAddress = opts.serverAddress
    57  	} else {
    58  		serverAddress = dockerCli.ElectAuthServer(ctx)
    59  		isDefaultRegistry = true
    60  	}
    61  	authConfig, err := dockerCli.ConfigureAuth(opts.user, opts.password, serverAddress, isDefaultRegistry)
    62  	if err != nil {
    63  		return err
    64  	}
    65  	response, err := clnt.RegistryLogin(ctx, authConfig)
    66  	if err != nil {
    67  		return err
    68  	}
    69  	if response.IdentityToken != "" {
    70  		authConfig.Password = ""
    71  		authConfig.IdentityToken = response.IdentityToken
    72  	}
    73  	if err := client.StoreCredentials(dockerCli.ConfigFile(), authConfig); err != nil {
    74  		return fmt.Errorf("保存认证信息失败: %v", err)
    75  	}
    76  
    77  	if response.Status != "" {
    78  		fmt.Fprintln(dockerCli.Out(), response.Status)
    79  	}
    80  	return nil
    81  }