summaryrefslogtreecommitdiff
path: root/cmd/podman/push.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman/push.go')
-rw-r--r--cmd/podman/push.go124
1 files changed, 48 insertions, 76 deletions
diff --git a/cmd/podman/push.go b/cmd/podman/push.go
index 361a25e35..56261a8d3 100644
--- a/cmd/podman/push.go
+++ b/cmd/podman/push.go
@@ -9,81 +9,61 @@ import (
"github.com/containers/image/directory"
"github.com/containers/image/manifest"
"github.com/containers/image/types"
- "github.com/containers/libpod/cmd/podman/libpodruntime"
+ "github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/libpod/image"
+ "github.com/containers/libpod/pkg/adapter"
"github.com/containers/libpod/pkg/util"
imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/pkg/errors"
- "github.com/urfave/cli"
+ "github.com/spf13/cobra"
)
var (
- pushFlags = []cli.Flag{
- cli.StringFlag{
- Name: "signature-policy",
- Usage: "`Pathname` of signature policy file (not usually used)",
- Hidden: true,
- },
- cli.StringFlag{
- Name: "creds",
- Usage: "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry",
- },
- cli.StringFlag{
- Name: "cert-dir",
- Usage: "`Pathname` of a directory containing TLS certificates and keys",
- },
- cli.BoolFlag{
- Name: "compress",
- Usage: "Compress tarball image layers when pushing to a directory using the 'dir' transport. (default is same compression type as source)",
- },
- cli.StringFlag{
- Name: "format, f",
- Usage: "Manifest type (oci, v2s1, or v2s2) to use when pushing an image using the 'dir:' transport (default is manifest type of source)",
- },
- cli.BoolTFlag{
- Name: "tls-verify",
- Usage: "Require HTTPS and verify certificates when contacting registries (default: true)",
- },
- cli.BoolFlag{
- Name: "remove-signatures",
- Usage: "Discard any pre-existing signatures in the image",
- },
- cli.StringFlag{
- Name: "sign-by",
- Usage: "Add a signature at the destination using the specified key",
- },
- cli.BoolFlag{
- Name: "quiet, q",
- Usage: "Don't output progress information when pushing images",
- },
- cli.StringFlag{
- Name: "authfile",
- Usage: "Path of the authentication file. Default is ${XDG_RUNTIME_DIR}/containers/auth.json. Use REGISTRY_AUTH_FILE environment variable to override. ",
- },
- }
+ pushCommand cliconfig.PushValues
pushDescription = fmt.Sprintf(`
Pushes an image to a specified location.
The Image "DESTINATION" uses a "transport":"details" format.
See podman-push(1) section "DESTINATION" for the expected format`)
- pushCommand = cli.Command{
- Name: "push",
- Usage: "Push an image to a specified destination",
- Description: pushDescription,
- Flags: sortFlags(pushFlags),
- Action: pushCmd,
- ArgsUsage: "IMAGE DESTINATION",
- OnUsageError: usageErrorHandler,
+ _pushCommand = &cobra.Command{
+ Use: "push",
+ Short: "Push an image to a specified destination",
+ Long: pushDescription,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ pushCommand.InputArgs = args
+ pushCommand.GlobalFlags = MainGlobalOpts
+ return pushCmd(&pushCommand)
+ },
+ Example: `podman push imageID docker://registry.example.com/repository:tag
+ podman push imageID oci-archive:/path/to/layout:image:tag
+ podman push --authfile temp-auths/myauths.json alpine docker://docker.io/myrepo/alpine`,
}
)
-func pushCmd(c *cli.Context) error {
+func init() {
+ pushCommand.Command = _pushCommand
+ pushCommand.SetUsageTemplate(UsageTemplate())
+ flags := pushCommand.Flags()
+ flags.MarkHidden("signature-policy")
+ flags.StringVar(&pushCommand.Authfile, "authfile", "", "Path of the authentication file. Default is ${XDG_RUNTIME_DIR}/containers/auth.json. Use REGISTRY_AUTH_FILE environment variable to override")
+ flags.StringVar(&pushCommand.CertDir, "cert-dir", "", "`Pathname` of a directory containing TLS certificates and keys")
+ flags.BoolVar(&pushCommand.Compress, "compress", false, "Compress tarball image layers when pushing to a directory using the 'dir' transport. (default is same compression type as source)")
+ flags.StringVar(&pushCommand.Creds, "creds", "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry")
+ flags.StringVarP(&pushCommand.Format, "format", "f", "", "Manifest type (oci, v2s1, or v2s2) to use when pushing an image using the 'dir:' transport (default is manifest type of source)")
+ flags.BoolVarP(&pushCommand.Quiet, "quiet", "q", false, "Don't output progress information when pushing images")
+ flags.BoolVar(&pushCommand.RemoveSignatures, "remove-signatures", false, "Discard any pre-existing signatures in the image")
+ flags.StringVar(&pushCommand.SignaturePolicy, "signature-policy", "", "`Pathname` of signature policy file (not usually used)")
+ flags.StringVar(&pushCommand.SignBy, "sign-by", "", "Add a signature at the destination using the specified key")
+ flags.BoolVar(&pushCommand.TlsVerify, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries (default: true)")
+}
+
+func pushCmd(c *cliconfig.PushValues) error {
var (
registryCreds *types.DockerAuthConfig
destName string
)
- args := c.Args()
+ args := c.InputArgs
if len(args) == 0 || len(args) > 2 {
return errors.New("podman push requires at least one image name, and optionally a second to specify a different destination name")
}
@@ -94,43 +74,40 @@ func pushCmd(c *cli.Context) error {
case 2:
destName = args[1]
}
- if err := validateFlags(c, pushFlags); err != nil {
- return err
- }
// --compress and --format can only be used for the "dir" transport
splitArg := strings.SplitN(destName, ":", 2)
- if c.IsSet("compress") || c.IsSet("format") {
+ if c.Flag("compress").Changed || c.Flag("format").Changed {
if splitArg[0] != directory.Transport.Name() {
return errors.Errorf("--compress and --format can be set only when pushing to a directory using the 'dir' transport")
}
}
- certPath := c.String("cert-dir")
- removeSignatures := c.Bool("remove-signatures")
- signBy := c.String("sign-by")
+ certPath := c.CertDir
+ removeSignatures := c.RemoveSignatures
+ signBy := c.SignBy
- if c.IsSet("creds") {
- creds, err := util.ParseRegistryCreds(c.String("creds"))
+ if c.Flag("creds").Changed {
+ creds, err := util.ParseRegistryCreds(c.Creds)
if err != nil {
return err
}
registryCreds = creds
}
- runtime, err := libpodruntime.GetRuntime(c)
+ runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not create runtime")
}
defer runtime.Shutdown(false)
var writer io.Writer
- if !c.Bool("quiet") {
+ if !c.Quiet {
writer = os.Stderr
}
var manifestType string
- if c.IsSet("format") {
+ if c.Flag("format").Changed {
switch c.String("format") {
case "oci":
manifestType = imgspecv1.MediaTypeImageManifest
@@ -147,8 +124,8 @@ func pushCmd(c *cli.Context) error {
DockerRegistryCreds: registryCreds,
DockerCertPath: certPath,
}
- if c.IsSet("tls-verify") {
- dockerRegistryOptions.DockerInsecureSkipTLSVerify = types.NewOptionalBool(!c.BoolT("tls-verify"))
+ if c.Flag("tls-verify").Changed {
+ dockerRegistryOptions.DockerInsecureSkipTLSVerify = types.NewOptionalBool(!c.TlsVerify)
}
so := image.SigningOptions{
@@ -156,12 +133,7 @@ func pushCmd(c *cli.Context) error {
SignBy: signBy,
}
- newImage, err := runtime.ImageRuntime().NewFromLocal(srcName)
- if err != nil {
- return err
- }
-
- authfile := getAuthFile(c.String("authfile"))
+ authfile := getAuthFile(c.Authfile)
- return newImage.PushImageToHeuristicDestination(getContext(), destName, manifestType, authfile, c.String("signature-policy"), writer, c.Bool("compress"), so, &dockerRegistryOptions, nil)
+ return runtime.Push(getContext(), srcName, destName, manifestType, authfile, c.SignaturePolicy, writer, c.Compress, so, &dockerRegistryOptions, nil)
}