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 }