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/registry
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/moby/moby/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())
|
|
}
|