This adds an internal fork of [github.com/docker/docker/registry], taken at commit [moby@f651a5d]. Git history was not preserved in this fork, but can be found using the URLs provided. This fork was created to remove the dependency on the "Moby" codebase, and because the CLI only needs a subset of its features. The original package was written specifically for use in the daemon code, and includes functionality that cannot be used in the CLI. [github.com/docker/docker/registry]: https://pkg.go.dev/github.com/docker/docker@v28.3.2+incompatible/registry [moby@49306c6]:49306c607b/registrySigned-off-by: Sebastiaan van Stijn <github@gone.nl> (cherry picked from commitf6b90bc253) Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
package plugin
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/distribution/reference"
|
|
"github.com/docker/cli/cli"
|
|
"github.com/docker/cli/cli/command"
|
|
"github.com/docker/cli/cli/trust"
|
|
"github.com/docker/cli/internal/jsonstream"
|
|
"github.com/docker/cli/internal/registry"
|
|
registrytypes "github.com/docker/docker/api/types/registry"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
type pushOptions struct {
|
|
name string
|
|
untrusted bool
|
|
}
|
|
|
|
func newPushCommand(dockerCli command.Cli) *cobra.Command {
|
|
var opts pushOptions
|
|
cmd := &cobra.Command{
|
|
Use: "push [OPTIONS] PLUGIN[:TAG]",
|
|
Short: "Push a plugin to a registry",
|
|
Args: cli.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
opts.name = args[0]
|
|
return runPush(cmd.Context(), dockerCli, opts)
|
|
},
|
|
}
|
|
|
|
flags := cmd.Flags()
|
|
|
|
command.AddTrustSigningFlags(flags, &opts.untrusted, dockerCli.ContentTrustEnabled())
|
|
|
|
return cmd
|
|
}
|
|
|
|
func runPush(ctx context.Context, dockerCli command.Cli, opts pushOptions) error {
|
|
named, err := reference.ParseNormalizedNamed(opts.name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if _, ok := named.(reference.Canonical); ok {
|
|
return errors.Errorf("invalid name: %s", opts.name)
|
|
}
|
|
|
|
named = reference.TagNameOnly(named)
|
|
|
|
repoInfo, _ := registry.ParseRepositoryInfo(named)
|
|
authConfig := command.ResolveAuthConfig(dockerCli.ConfigFile(), repoInfo.Index)
|
|
encodedAuth, err := registrytypes.EncodeAuthConfig(authConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
responseBody, err := dockerCli.Client().PluginPush(ctx, reference.FamiliarString(named), encodedAuth)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer responseBody.Close()
|
|
|
|
if !opts.untrusted {
|
|
return trust.PushTrustedReference(ctx, dockerCli, repoInfo, named, authConfig, responseBody, command.UserAgent())
|
|
}
|
|
|
|
return jsonstream.Display(ctx, responseBody, dockerCli.Out())
|
|
}
|