push.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package plugin
  2. import (
  3. "fmt"
  4. "golang.org/x/net/context"
  5. "github.com/docker/docker/cli"
  6. "github.com/docker/docker/cli/command"
  7. "github.com/docker/docker/reference"
  8. "github.com/docker/docker/registry"
  9. "github.com/spf13/cobra"
  10. )
  11. func newPushCommand(dockerCli *command.DockerCli) *cobra.Command {
  12. cmd := &cobra.Command{
  13. Use: "push PLUGIN[:TAG]",
  14. Short: "Push a plugin to a registry",
  15. Args: cli.ExactArgs(1),
  16. RunE: func(cmd *cobra.Command, args []string) error {
  17. return runPush(dockerCli, args[0])
  18. },
  19. }
  20. return cmd
  21. }
  22. func runPush(dockerCli *command.DockerCli, name string) error {
  23. named, err := reference.ParseNamed(name) // FIXME: validate
  24. if err != nil {
  25. return err
  26. }
  27. if reference.IsNameOnly(named) {
  28. named = reference.WithDefaultTag(named)
  29. }
  30. ref, ok := named.(reference.NamedTagged)
  31. if !ok {
  32. return fmt.Errorf("invalid name: %s", named.String())
  33. }
  34. ctx := context.Background()
  35. repoInfo, err := registry.ParseRepositoryInfo(named)
  36. if err != nil {
  37. return err
  38. }
  39. authConfig := command.ResolveAuthConfig(ctx, dockerCli, repoInfo.Index)
  40. encodedAuth, err := command.EncodeAuthToBase64(authConfig)
  41. if err != nil {
  42. return err
  43. }
  44. return dockerCli.Client().PluginPush(ctx, ref.String(), encodedAuth)
  45. }