summaryrefslogtreecommitdiff
path: root/cmd/podman/pull.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman/pull.go')
-rw-r--r--cmd/podman/pull.go200
1 files changed, 0 insertions, 200 deletions
diff --git a/cmd/podman/pull.go b/cmd/podman/pull.go
deleted file mode 100644
index f800d68fe..000000000
--- a/cmd/podman/pull.go
+++ /dev/null
@@ -1,200 +0,0 @@
-package main
-
-import (
- "fmt"
- "io"
- "os"
-
- buildahcli "github.com/containers/buildah/pkg/cli"
- "github.com/containers/image/v5/docker"
- dockerarchive "github.com/containers/image/v5/docker/archive"
- "github.com/containers/image/v5/transports/alltransports"
- "github.com/containers/image/v5/types"
- "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"
- "github.com/docker/distribution/reference"
- "github.com/opentracing/opentracing-go"
- "github.com/pkg/errors"
- "github.com/sirupsen/logrus"
- "github.com/spf13/cobra"
-)
-
-var (
- pullCommand cliconfig.PullValues
- pullDescription = `Pulls an image from a registry and stores it locally.
-
- An image can be pulled using its tag or digest. If a tag is not specified, the image with the 'latest' tag (if it exists) is pulled.`
- _pullCommand = &cobra.Command{
- Use: "pull [flags] IMAGE-PATH",
- Short: "Pull an image from a registry",
- Long: pullDescription,
- RunE: func(cmd *cobra.Command, args []string) error {
- pullCommand.InputArgs = args
- pullCommand.GlobalFlags = MainGlobalOpts
- pullCommand.Remote = remoteclient
- return pullCmd(&pullCommand)
- },
- Example: `podman pull imageName
- podman pull fedora:latest`,
- }
-)
-
-func init() {
-
- if !remote {
- _pullCommand.Example = fmt.Sprintf("%s\n podman pull --cert-dir image/certs --authfile temp-auths/myauths.json docker://docker.io/myrepo/finaltest", _pullCommand.Example)
-
- }
- pullCommand.Command = _pullCommand
- pullCommand.SetHelpTemplate(HelpTemplate())
- pullCommand.SetUsageTemplate(UsageTemplate())
- flags := pullCommand.Flags()
- flags.BoolVar(&pullCommand.AllTags, "all-tags", false, "All tagged images in the repository will be pulled")
- flags.StringVar(&pullCommand.Creds, "creds", "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry")
- flags.BoolVarP(&pullCommand.Quiet, "quiet", "q", false, "Suppress output information when pulling images")
- flags.StringVar(&pullCommand.OverrideArch, "override-arch", "", "use `ARCH` instead of the architecture of the machine for choosing images")
- flags.StringVar(&pullCommand.OverrideOS, "override-os", "", "use `OS` instead of the running OS for choosing images")
- markFlagHidden(flags, "override-os")
- // Disabled flags for the remote client
- if !remote {
- flags.StringVar(&pullCommand.Authfile, "authfile", buildahcli.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
- flags.StringVar(&pullCommand.CertDir, "cert-dir", "", "`Pathname` of a directory containing TLS certificates and keys")
- flags.StringVar(&pullCommand.SignaturePolicy, "signature-policy", "", "`Pathname` of signature policy file (not usually used)")
- flags.BoolVar(&pullCommand.TlsVerify, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries")
- markFlagHidden(flags, "signature-policy")
- }
-}
-
-// pullCmd gets the data from the command line and calls pullImage
-// to copy an image from a registry to a local machine
-func pullCmd(c *cliconfig.PullValues) (retError error) {
- defer func() {
- if retError != nil && exitCode == 0 {
- exitCode = 1
- }
- }()
- if c.Bool("trace") {
- span, _ := opentracing.StartSpanFromContext(Ctx, "pullCmd")
- defer span.Finish()
- }
-
- runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
-
- if err != nil {
- return errors.Wrapf(err, "could not get runtime")
- }
- defer runtime.DeferredShutdown(false)
-
- args := c.InputArgs
- if len(args) == 0 {
- return errors.Errorf("an image name must be specified")
- }
- if len(args) > 1 {
- return errors.Errorf("too many arguments. Requires exactly 1")
- }
-
- if c.Authfile != "" {
- if _, err := os.Stat(c.Authfile); err != nil {
- return errors.Wrapf(err, "error getting authfile %s", c.Authfile)
- }
- }
-
- ctx := getContext()
- imageName := args[0]
-
- imageRef, err := alltransports.ParseImageName(imageName)
- if err != nil {
- imageRef, err = alltransports.ParseImageName(fmt.Sprintf("%s://%s", docker.Transport.Name(), imageName))
- if err != nil {
- return errors.Errorf("invalid image reference %q", imageName)
- }
- }
-
- var writer io.Writer
- if !c.Quiet {
- writer = os.Stderr
- }
- // Special-case for docker-archive which allows multiple tags.
- if imageRef.Transport().Name() == dockerarchive.Transport.Name() {
- newImage, err := runtime.LoadFromArchiveReference(getContext(), imageRef, c.SignaturePolicy, writer)
- if err != nil {
- return errors.Wrapf(err, "error pulling image %q", imageName)
- }
- fmt.Println(newImage[0].ID())
- return nil
- }
-
- var registryCreds *types.DockerAuthConfig
- if c.Flag("creds").Changed {
- creds, err := util.ParseRegistryCreds(c.Creds)
- if err != nil {
- return err
- }
- registryCreds = creds
- }
- dockerRegistryOptions := image.DockerRegistryOptions{
- DockerRegistryCreds: registryCreds,
- DockerCertPath: c.CertDir,
- OSChoice: c.OverrideOS,
- ArchitectureChoice: c.OverrideArch,
- }
- if c.IsSet("tls-verify") {
- dockerRegistryOptions.DockerInsecureSkipTLSVerify = types.NewOptionalBool(!c.TlsVerify)
- }
-
- if !c.Bool("all-tags") {
- newImage, err := runtime.New(getContext(), imageName, c.SignaturePolicy, c.Authfile, writer, &dockerRegistryOptions, image.SigningOptions{}, nil, util.PullImageAlways)
- if err != nil {
- return errors.Wrapf(err, "error pulling image %q", imageName)
- }
- fmt.Println(newImage.ID())
- return nil
- }
-
- // --all-tags requires the docker transport
- if imageRef.Transport().Name() != docker.Transport.Name() {
- return errors.New("--all-tags requires docker transport")
- }
-
- // all-tags doesn't work with a tagged reference, so let's check early
- namedRef, err := reference.Parse(imageName)
- if err != nil {
- return errors.Wrapf(err, "error parsing %q", imageName)
- }
- if _, isTagged := namedRef.(reference.Tagged); isTagged {
- return errors.New("--all-tags requires a reference without a tag")
-
- }
-
- systemContext := image.GetSystemContext("", c.Authfile, false)
- tags, err := docker.GetRepositoryTags(ctx, systemContext, imageRef)
- if err != nil {
- return errors.Wrapf(err, "error getting repository tags")
- }
-
- var foundIDs []string
- for _, tag := range tags {
- name := imageName + ":" + tag
- newImage, err := runtime.New(getContext(), name, c.SignaturePolicy, c.Authfile, writer, &dockerRegistryOptions, image.SigningOptions{}, nil, util.PullImageAlways)
- if err != nil {
- logrus.Errorf("error pulling image %q", name)
- continue
- }
- foundIDs = append(foundIDs, newImage.ID())
- }
-
- if len(tags) != len(foundIDs) {
- return errors.Errorf("error pulling image %q", imageName)
- }
-
- if len(foundIDs) > 1 {
- fmt.Println("Pulled Images:")
- }
- for _, id := range foundIDs {
- fmt.Println(id)
- }
-
- return nil
-}