push.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package client
  2. import (
  3. "io"
  4. "golang.org/x/net/context"
  5. Cli "github.com/docker/docker/cli"
  6. "github.com/docker/docker/pkg/jsonmessage"
  7. flag "github.com/docker/docker/pkg/mflag"
  8. "github.com/docker/docker/reference"
  9. "github.com/docker/docker/registry"
  10. "github.com/docker/engine-api/types"
  11. )
  12. // CmdPush pushes an image or repository to the registry.
  13. //
  14. // Usage: docker push NAME[:TAG]
  15. func (cli *DockerCli) CmdPush(args ...string) error {
  16. cmd := Cli.Subcmd("push", []string{"NAME[:TAG]"}, Cli.DockerCommands["push"].Description, true)
  17. addTrustedFlags(cmd, false)
  18. cmd.Require(flag.Exact, 1)
  19. cmd.ParseFlags(args, true)
  20. ref, err := reference.ParseNamed(cmd.Arg(0))
  21. if err != nil {
  22. return err
  23. }
  24. // Resolve the Repository name from fqn to RepositoryInfo
  25. repoInfo, err := registry.ParseRepositoryInfo(ref)
  26. if err != nil {
  27. return err
  28. }
  29. ctx := context.Background()
  30. // Resolve the Auth config relevant for this server
  31. authConfig := cli.ResolveAuthConfig(ctx, repoInfo.Index)
  32. requestPrivilege := cli.RegistryAuthenticationPrivilegedFunc(repoInfo.Index, "push")
  33. if IsTrusted() {
  34. return cli.trustedPush(ctx, repoInfo, ref, authConfig, requestPrivilege)
  35. }
  36. responseBody, err := cli.imagePushPrivileged(ctx, authConfig, ref.String(), requestPrivilege)
  37. if err != nil {
  38. return err
  39. }
  40. defer responseBody.Close()
  41. return jsonmessage.DisplayJSONMessagesStream(responseBody, cli.out, cli.outFd, cli.isTerminalOut, nil)
  42. }
  43. func (cli *DockerCli) imagePushPrivileged(ctx context.Context, authConfig types.AuthConfig, ref string, requestPrivilege types.RequestPrivilegeFunc) (io.ReadCloser, error) {
  44. encodedAuth, err := EncodeAuthToBase64(authConfig)
  45. if err != nil {
  46. return nil, err
  47. }
  48. options := types.ImagePushOptions{
  49. RegistryAuth: encodedAuth,
  50. PrivilegeFunc: requestPrivilege,
  51. }
  52. return cli.client.ImagePush(ctx, ref, options)
  53. }