mirror of https://github.com/containers/podman.git
				
				
				
			
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 
 | |
| 	"github.com/containers/libpod/cmd/podman/cliconfig"
 | |
| 	"github.com/containers/libpod/cmd/podman/shared/parse"
 | |
| 	"github.com/containers/libpod/pkg/adapter"
 | |
| 	multierror "github.com/hashicorp/go-multierror"
 | |
| 	"github.com/pkg/errors"
 | |
| 	"github.com/spf13/cobra"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	importCommand cliconfig.ImportValues
 | |
| 
 | |
| 	importDescription = `Create a container image from the contents of the specified tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz).
 | |
| 
 | |
|   Note remote tar balls can be specified, via web address.
 | |
|   Optionally tag the image. You can specify the instructions using the --change option.`
 | |
| 	_importCommand = &cobra.Command{
 | |
| 		Use:   "import [flags] PATH [REFERENCE]",
 | |
| 		Short: "Import a tarball to create a filesystem image",
 | |
| 		Long:  importDescription,
 | |
| 		RunE: func(cmd *cobra.Command, args []string) error {
 | |
| 			importCommand.InputArgs = args
 | |
| 			importCommand.GlobalFlags = MainGlobalOpts
 | |
| 			importCommand.Remote = remoteclient
 | |
| 			return importCmd(&importCommand)
 | |
| 		},
 | |
| 		Example: `podman import http://example.com/ctr.tar url-image
 | |
|   cat ctr.tar | podman -q import --message "importing the ctr.tar tarball" - image-imported
 | |
|   cat ctr.tar | podman import -`,
 | |
| 	}
 | |
| )
 | |
| 
 | |
| func init() {
 | |
| 	importCommand.Command = _importCommand
 | |
| 	importCommand.SetHelpTemplate(HelpTemplate())
 | |
| 	importCommand.SetUsageTemplate(UsageTemplate())
 | |
| 	flags := importCommand.Flags()
 | |
| 	flags.StringArrayVarP(&importCommand.Change, "change", "c", []string{}, "Apply the following possible instructions to the created image (default []): CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | STOPSIGNAL | USER | VOLUME | WORKDIR")
 | |
| 	flags.StringVarP(&importCommand.Message, "message", "m", "", "Set commit message for imported image")
 | |
| 	flags.BoolVarP(&importCommand.Quiet, "quiet", "q", false, "Suppress output")
 | |
| 
 | |
| }
 | |
| 
 | |
| func importCmd(c *cliconfig.ImportValues) error {
 | |
| 	runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
 | |
| 	if err != nil {
 | |
| 		return errors.Wrapf(err, "could not get runtime")
 | |
| 	}
 | |
| 	defer runtime.DeferredShutdown(false)
 | |
| 
 | |
| 	var (
 | |
| 		source    string
 | |
| 		reference string
 | |
| 	)
 | |
| 	args := c.InputArgs
 | |
| 	switch len(args) {
 | |
| 	case 0:
 | |
| 		return errors.Errorf("need to give the path to the tarball, or must specify a tarball of '-' for stdin")
 | |
| 	case 1:
 | |
| 		source = args[0]
 | |
| 	case 2:
 | |
| 		source = args[0]
 | |
| 		reference = args[1]
 | |
| 	default:
 | |
| 		return errors.Errorf("too many arguments. Usage TARBALL [REFERENCE]")
 | |
| 	}
 | |
| 
 | |
| 	errFileName := parse.ValidateFileName(source)
 | |
| 	errURL := parse.ValidURL(source)
 | |
| 
 | |
| 	if errFileName != nil && errURL != nil {
 | |
| 		return multierror.Append(errFileName, errURL)
 | |
| 	}
 | |
| 
 | |
| 	quiet := c.Quiet
 | |
| 	if runtime.Remote {
 | |
| 		quiet = false
 | |
| 	}
 | |
| 	iid, err := runtime.Import(getContext(), source, reference, importCommand.Change, c.String("message"), quiet)
 | |
| 	if err == nil {
 | |
| 		fmt.Println(iid)
 | |
| 	}
 | |
| 	return err
 | |
| }
 |