github.com/walkingsparrow/docker@v1.4.2-0.20151218153551-b708a2249bfa/api/client/push.go (about) 1 package client 2 3 import ( 4 "errors" 5 "io" 6 7 "github.com/docker/docker/api/client/lib" 8 "github.com/docker/docker/api/types" 9 Cli "github.com/docker/docker/cli" 10 "github.com/docker/docker/pkg/jsonmessage" 11 flag "github.com/docker/docker/pkg/mflag" 12 "github.com/docker/docker/reference" 13 "github.com/docker/docker/registry" 14 ) 15 16 // CmdPush pushes an image or repository to the registry. 17 // 18 // Usage: docker push NAME[:TAG] 19 func (cli *DockerCli) CmdPush(args ...string) error { 20 cmd := Cli.Subcmd("push", []string{"NAME[:TAG]"}, Cli.DockerCommands["push"].Description, true) 21 addTrustedFlags(cmd, false) 22 cmd.Require(flag.Exact, 1) 23 24 cmd.ParseFlags(args, true) 25 26 ref, err := reference.ParseNamed(cmd.Arg(0)) 27 if err != nil { 28 return err 29 } 30 31 var tag string 32 switch x := ref.(type) { 33 case reference.Canonical: 34 return errors.New("cannot push a digest reference") 35 case reference.NamedTagged: 36 tag = x.Tag() 37 } 38 39 // Resolve the Repository name from fqn to RepositoryInfo 40 repoInfo, err := registry.ParseRepositoryInfo(ref) 41 if err != nil { 42 return err 43 } 44 // Resolve the Auth config relevant for this server 45 authConfig := registry.ResolveAuthConfig(cli.configFile.AuthConfigs, repoInfo.Index) 46 47 requestPrivilege := cli.registryAuthenticationPrivilegedFunc(repoInfo.Index, "push") 48 if isTrusted() { 49 return cli.trustedPush(repoInfo, tag, authConfig, requestPrivilege) 50 } 51 52 return cli.imagePushPrivileged(authConfig, ref.Name(), tag, cli.out, requestPrivilege) 53 } 54 55 func (cli *DockerCli) imagePushPrivileged(authConfig types.AuthConfig, imageID, tag string, outputStream io.Writer, requestPrivilege lib.RequestPrivilegeFunc) error { 56 encodedAuth, err := encodeAuthToBase64(authConfig) 57 if err != nil { 58 return err 59 } 60 options := types.ImagePushOptions{ 61 ImageID: imageID, 62 Tag: tag, 63 RegistryAuth: encodedAuth, 64 } 65 66 responseBody, err := cli.client.ImagePush(options, requestPrivilege) 67 if err != nil { 68 return err 69 } 70 defer responseBody.Close() 71 72 return jsonmessage.DisplayJSONMessagesStream(responseBody, outputStream, cli.outFd, cli.isTerminalOut) 73 }