6 "golang.org/x/net/context"
8 "github.com/docker/cli/cli"
9 "github.com/docker/cli/cli/command"
10 "github.com/docker/docker/registry"
11 "github.com/pkg/errors"
12 "github.com/spf13/cobra"
15 type loginOptions struct {
21 // NewLoginCommand creates a new `docker login` command
22 func NewLoginCommand(dockerCli command.Cli) *cobra.Command {
25 cmd := &cobra.Command{
26 Use: "login [OPTIONS] [SERVER]",
27 Short: "Log in to a Docker registry",
28 Long: "Log in to a Docker registry.\nIf no server is specified, the default is defined by the daemon.",
29 Args: cli.RequiresMaxArgs(1),
30 RunE: func(cmd *cobra.Command, args []string) error {
32 opts.serverAddress = args[0]
34 return runLogin(dockerCli, opts)
40 flags.StringVarP(&opts.user, "username", "u", "", "Username")
41 flags.StringVarP(&opts.password, "password", "p", "", "Password")
46 func runLogin(dockerCli command.Cli, opts loginOptions) error {
47 ctx := context.Background()
48 clnt := dockerCli.Client()
52 authServer = command.ElectAuthServer(ctx, dockerCli)
54 if opts.serverAddress != "" && opts.serverAddress != registry.DefaultNamespace {
55 serverAddress = opts.serverAddress
57 serverAddress = authServer
60 isDefaultRegistry := serverAddress == authServer
62 authConfig, err := command.ConfigureAuth(dockerCli, opts.user, opts.password, serverAddress, isDefaultRegistry)
66 response, err := clnt.RegistryLogin(ctx, authConfig)
70 if response.IdentityToken != "" {
71 authConfig.Password = ""
72 authConfig.IdentityToken = response.IdentityToken
74 if err := dockerCli.CredentialsStore(serverAddress).Store(authConfig); err != nil {
75 return errors.Errorf("Error saving credentials: %v", err)
78 if response.Status != "" {
79 fmt.Fprintln(dockerCli.Out(), response.Status)