Migrate import command to cobra
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
This commit is contained in:
parent
ca01e57d55
commit
9d2e8abd30
5 changed files with 87 additions and 70 deletions
|
@ -11,7 +11,6 @@ func (cli *DockerCli) Command(name string) func(...string) error {
|
||||||
"exec": cli.CmdExec,
|
"exec": cli.CmdExec,
|
||||||
"history": cli.CmdHistory,
|
"history": cli.CmdHistory,
|
||||||
"images": cli.CmdImages,
|
"images": cli.CmdImages,
|
||||||
"import": cli.CmdImport,
|
|
||||||
"info": cli.CmdInfo,
|
"info": cli.CmdInfo,
|
||||||
"inspect": cli.CmdInspect,
|
"inspect": cli.CmdInspect,
|
||||||
"kill": cli.CmdKill,
|
"kill": cli.CmdKill,
|
||||||
|
|
86
api/client/image/import.go
Normal file
86
api/client/image/import.go
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
package image
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
"github.com/docker/docker/api/client"
|
||||||
|
"github.com/docker/docker/cli"
|
||||||
|
"github.com/docker/docker/pkg/jsonmessage"
|
||||||
|
"github.com/docker/docker/pkg/urlutil"
|
||||||
|
"github.com/docker/engine-api/types"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
type importOptions struct {
|
||||||
|
source string
|
||||||
|
reference string
|
||||||
|
changes []string
|
||||||
|
message string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewImportCommand creates a new `docker import` command
|
||||||
|
func NewImportCommand(dockerCli *client.DockerCli) *cobra.Command {
|
||||||
|
var opts importOptions
|
||||||
|
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]",
|
||||||
|
Short: "Import the contents from a tarball to create a filesystem image",
|
||||||
|
Args: cli.RequiresMinArgs(1),
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
opts.source = args[0]
|
||||||
|
if len(args) > 1 {
|
||||||
|
opts.reference = args[1]
|
||||||
|
}
|
||||||
|
return runImport(dockerCli, opts)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
flags := cmd.Flags()
|
||||||
|
|
||||||
|
flags.StringSliceVarP(&opts.changes, "change", "c", []string{}, "Apply Dockerfile instruction to the created image")
|
||||||
|
flags.StringVarP(&opts.message, "message", "m", "", "Set commit message for imported image")
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func runImport(dockerCli *client.DockerCli, opts importOptions) error {
|
||||||
|
var (
|
||||||
|
in io.Reader
|
||||||
|
srcName = opts.source
|
||||||
|
)
|
||||||
|
|
||||||
|
if opts.source == "-" {
|
||||||
|
in = dockerCli.In()
|
||||||
|
} else if !urlutil.IsURL(opts.source) {
|
||||||
|
srcName = "-"
|
||||||
|
file, err := os.Open(opts.source)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
in = file
|
||||||
|
}
|
||||||
|
|
||||||
|
source := types.ImageImportSource{
|
||||||
|
Source: in,
|
||||||
|
SourceName: srcName,
|
||||||
|
}
|
||||||
|
|
||||||
|
options := types.ImageImportOptions{
|
||||||
|
Message: opts.message,
|
||||||
|
Changes: opts.changes,
|
||||||
|
}
|
||||||
|
|
||||||
|
clnt := dockerCli.Client()
|
||||||
|
|
||||||
|
responseBody, err := clnt.ImageImport(context.Background(), source, opts.reference, options)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer responseBody.Close()
|
||||||
|
|
||||||
|
return jsonmessage.DisplayJSONMessagesStream(responseBody, dockerCli.Out(), dockerCli.OutFd(), dockerCli.IsTerminalOut(), nil)
|
||||||
|
}
|
|
@ -1,68 +0,0 @@
|
||||||
package client
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
|
|
||||||
Cli "github.com/docker/docker/cli"
|
|
||||||
"github.com/docker/docker/opts"
|
|
||||||
"github.com/docker/docker/pkg/jsonmessage"
|
|
||||||
flag "github.com/docker/docker/pkg/mflag"
|
|
||||||
"github.com/docker/docker/pkg/urlutil"
|
|
||||||
"github.com/docker/engine-api/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
// CmdImport creates an empty filesystem image, imports the contents of the tarball into the image, and optionally tags the image.
|
|
||||||
//
|
|
||||||
// The URL argument is the address of a tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) file or a path to local file relative to docker client. If the URL is '-', then the tar file is read from STDIN.
|
|
||||||
//
|
|
||||||
// Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
|
|
||||||
func (cli *DockerCli) CmdImport(args ...string) error {
|
|
||||||
cmd := Cli.Subcmd("import", []string{"file|URL|- [REPOSITORY[:TAG]]"}, Cli.DockerCommands["import"].Description, true)
|
|
||||||
flChanges := opts.NewListOpts(nil)
|
|
||||||
cmd.Var(&flChanges, []string{"c", "-change"}, "Apply Dockerfile instruction to the created image")
|
|
||||||
message := cmd.String([]string{"m", "-message"}, "", "Set commit message for imported image")
|
|
||||||
cmd.Require(flag.Min, 1)
|
|
||||||
|
|
||||||
cmd.ParseFlags(args, true)
|
|
||||||
|
|
||||||
var (
|
|
||||||
in io.Reader
|
|
||||||
src = cmd.Arg(0)
|
|
||||||
srcName = src
|
|
||||||
ref = cmd.Arg(1)
|
|
||||||
changes = flChanges.GetAll()
|
|
||||||
)
|
|
||||||
|
|
||||||
if src == "-" {
|
|
||||||
in = cli.in
|
|
||||||
} else if !urlutil.IsURL(src) {
|
|
||||||
srcName = "-"
|
|
||||||
file, err := os.Open(src)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
in = file
|
|
||||||
}
|
|
||||||
|
|
||||||
source := types.ImageImportSource{
|
|
||||||
Source: in,
|
|
||||||
SourceName: srcName,
|
|
||||||
}
|
|
||||||
|
|
||||||
options := types.ImageImportOptions{
|
|
||||||
Message: *message,
|
|
||||||
Changes: changes,
|
|
||||||
}
|
|
||||||
|
|
||||||
responseBody, err := cli.client.ImageImport(context.Background(), source, ref, options)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer responseBody.Close()
|
|
||||||
|
|
||||||
return jsonmessage.DisplayJSONMessagesStream(responseBody, cli.out, cli.outFd, cli.isTerminalOut, nil)
|
|
||||||
}
|
|
|
@ -44,6 +44,7 @@ func NewCobraAdaptor(clientFlags *cliflags.ClientFlags) CobraAdaptor {
|
||||||
container.NewUnpauseCommand(dockerCli),
|
container.NewUnpauseCommand(dockerCli),
|
||||||
image.NewRemoveCommand(dockerCli),
|
image.NewRemoveCommand(dockerCli),
|
||||||
image.NewSearchCommand(dockerCli),
|
image.NewSearchCommand(dockerCli),
|
||||||
|
image.NewImportCommand(dockerCli),
|
||||||
network.NewNetworkCommand(dockerCli),
|
network.NewNetworkCommand(dockerCli),
|
||||||
volume.NewVolumeCommand(dockerCli),
|
volume.NewVolumeCommand(dockerCli),
|
||||||
)
|
)
|
||||||
|
|
|
@ -16,7 +16,6 @@ var DockerCommandUsage = []Command{
|
||||||
{"exec", "Run a command in a running container"},
|
{"exec", "Run a command in a running container"},
|
||||||
{"history", "Show the history of an image"},
|
{"history", "Show the history of an image"},
|
||||||
{"images", "List images"},
|
{"images", "List images"},
|
||||||
{"import", "Import the contents from a tarball to create a filesystem image"},
|
|
||||||
{"info", "Display system-wide information"},
|
{"info", "Display system-wide information"},
|
||||||
{"inspect", "Return low-level information on a container or image"},
|
{"inspect", "Return low-level information on a container or image"},
|
||||||
{"kill", "Kill a running container"},
|
{"kill", "Kill a running container"},
|
||||||
|
|
Loading…
Reference in a new issue