Explorar o código

Use spf13/cobra for docker logs

This fix is part of the effort to convert commands to spf13/cobra #23211.

Thif fix coverted command `docker logs` to use spf13/cobra

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
Yong Tang %!s(int64=9) %!d(string=hai) anos
pai
achega
4f4b59cc43
Modificáronse 5 ficheiros con 89 adicións e 70 borrados
  1. 0 1
      api/client/commands.go
  2. 88 0
      api/client/container/logs.go
  3. 0 68
      api/client/logs.go
  4. 1 0
      cli/cobraadaptor/adaptor.go
  5. 0 1
      cli/usage.go

+ 0 - 1
api/client/commands.go

@@ -19,7 +19,6 @@ func (cli *DockerCli) Command(name string) func(...string) error {
 		"load":               cli.CmdLoad,
 		"load":               cli.CmdLoad,
 		"login":              cli.CmdLogin,
 		"login":              cli.CmdLogin,
 		"logout":             cli.CmdLogout,
 		"logout":             cli.CmdLogout,
-		"logs":               cli.CmdLogs,
 		"network":            cli.CmdNetwork,
 		"network":            cli.CmdNetwork,
 		"network create":     cli.CmdNetworkCreate,
 		"network create":     cli.CmdNetworkCreate,
 		"network connect":    cli.CmdNetworkConnect,
 		"network connect":    cli.CmdNetworkConnect,

+ 88 - 0
api/client/container/logs.go

@@ -0,0 +1,88 @@
+package container
+
+import (
+	"fmt"
+	"io"
+
+	"golang.org/x/net/context"
+
+	"github.com/docker/docker/api/client"
+	"github.com/docker/docker/cli"
+	"github.com/docker/docker/pkg/stdcopy"
+	"github.com/docker/engine-api/types"
+	"github.com/spf13/cobra"
+)
+
+var validDrivers = map[string]bool{
+	"json-file": true,
+	"journald":  true,
+}
+
+type logsOptions struct {
+	follow     bool
+	since      string
+	timestamps bool
+	details    bool
+	tail       string
+
+	container string
+}
+
+// NewLogsCommand creats a new cobra.Command for `docker logs`
+func NewLogsCommand(dockerCli *client.DockerCli) *cobra.Command {
+	var opts logsOptions
+
+	cmd := &cobra.Command{
+		Use:   "logs [OPTIONS] CONTAINER",
+		Short: "Fetch the logs of a container",
+		Args:  cli.ExactArgs(1),
+		RunE: func(cmd *cobra.Command, args []string) error {
+			opts.container = args[0]
+			return runLogs(dockerCli, &opts)
+		},
+	}
+	cmd.SetFlagErrorFunc(flagErrorFunc)
+
+	flags := cmd.Flags()
+	flags.BoolVarP(&opts.follow, "follow", "f", false, "Follow log output")
+	flags.StringVar(&opts.since, "since", "", "Show logs since timestamp")
+	flags.BoolVarP(&opts.timestamps, "timestamps", "t", false, "Show timestamps")
+	flags.BoolVar(&opts.details, "details", false, "Show extra details provided to logs")
+	flags.StringVar(&opts.tail, "tail", "all", "Number of lines to show from the end of the logs")
+	return cmd
+}
+
+func runLogs(dockerCli *client.DockerCli, opts *logsOptions) error {
+	ctx := context.Background()
+
+	c, err := dockerCli.Client().ContainerInspect(ctx, opts.container)
+	if err != nil {
+		return err
+	}
+
+	if !validDrivers[c.HostConfig.LogConfig.Type] {
+		return fmt.Errorf("\"logs\" command is supported only for \"json-file\" and \"journald\" logging drivers (got: %s)", c.HostConfig.LogConfig.Type)
+	}
+
+	options := types.ContainerLogsOptions{
+		ShowStdout: true,
+		ShowStderr: true,
+		Since:      opts.since,
+		Timestamps: opts.timestamps,
+		Follow:     opts.follow,
+		Tail:       opts.tail,
+		Details:    opts.details,
+	}
+	responseBody, err := dockerCli.Client().ContainerLogs(ctx, opts.container, options)
+	if err != nil {
+		return err
+	}
+	defer responseBody.Close()
+
+	if c.Config.Tty {
+		_, err = io.Copy(dockerCli.Out(), responseBody)
+	} else {
+		_, err = stdcopy.StdCopy(dockerCli.Out(), dockerCli.Err(), responseBody)
+	}
+	return err
+}

+ 0 - 68
api/client/logs.go

@@ -1,68 +0,0 @@
-package client
-
-import (
-	"fmt"
-	"io"
-
-	"golang.org/x/net/context"
-
-	Cli "github.com/docker/docker/cli"
-	flag "github.com/docker/docker/pkg/mflag"
-	"github.com/docker/docker/pkg/stdcopy"
-	"github.com/docker/engine-api/types"
-)
-
-var validDrivers = map[string]bool{
-	"json-file": true,
-	"journald":  true,
-}
-
-// CmdLogs fetches the logs of a given container.
-//
-// docker logs [OPTIONS] CONTAINER
-func (cli *DockerCli) CmdLogs(args ...string) error {
-	cmd := Cli.Subcmd("logs", []string{"CONTAINER"}, Cli.DockerCommands["logs"].Description, true)
-	follow := cmd.Bool([]string{"f", "-follow"}, false, "Follow log output")
-	since := cmd.String([]string{"-since"}, "", "Show logs since timestamp")
-	times := cmd.Bool([]string{"t", "-timestamps"}, false, "Show timestamps")
-	details := cmd.Bool([]string{"-details"}, false, "Show extra details provided to logs")
-	tail := cmd.String([]string{"-tail"}, "all", "Number of lines to show from the end of the logs")
-	cmd.Require(flag.Exact, 1)
-
-	cmd.ParseFlags(args, true)
-
-	name := cmd.Arg(0)
-
-	ctx := context.Background()
-
-	c, err := cli.client.ContainerInspect(ctx, name)
-	if err != nil {
-		return err
-	}
-
-	if !validDrivers[c.HostConfig.LogConfig.Type] {
-		return fmt.Errorf("\"logs\" command is supported only for \"json-file\" and \"journald\" logging drivers (got: %s)", c.HostConfig.LogConfig.Type)
-	}
-
-	options := types.ContainerLogsOptions{
-		ShowStdout: true,
-		ShowStderr: true,
-		Since:      *since,
-		Timestamps: *times,
-		Follow:     *follow,
-		Tail:       *tail,
-		Details:    *details,
-	}
-	responseBody, err := cli.client.ContainerLogs(ctx, name, options)
-	if err != nil {
-		return err
-	}
-	defer responseBody.Close()
-
-	if c.Config.Tty {
-		_, err = io.Copy(cli.out, responseBody)
-	} else {
-		_, err = stdcopy.StdCopy(cli.out, cli.err, responseBody)
-	}
-	return err
-}

+ 1 - 0
cli/cobraadaptor/adaptor.go

@@ -35,6 +35,7 @@ func NewCobraAdaptor(clientFlags *cliflags.ClientFlags) CobraAdaptor {
 	rootCmd.AddCommand(
 	rootCmd.AddCommand(
 		container.NewCreateCommand(dockerCli),
 		container.NewCreateCommand(dockerCli),
 		container.NewExportCommand(dockerCli),
 		container.NewExportCommand(dockerCli),
+		container.NewLogsCommand(dockerCli),
 		container.NewRunCommand(dockerCli),
 		container.NewRunCommand(dockerCli),
 		container.NewStopCommand(dockerCli),
 		container.NewStopCommand(dockerCli),
 		image.NewRemoveCommand(dockerCli),
 		image.NewRemoveCommand(dockerCli),

+ 0 - 1
cli/usage.go

@@ -24,7 +24,6 @@ var DockerCommandUsage = []Command{
 	{"load", "Load an image from a tar archive or STDIN"},
 	{"load", "Load an image from a tar archive or STDIN"},
 	{"login", "Log in to a Docker registry"},
 	{"login", "Log in to a Docker registry"},
 	{"logout", "Log out from a Docker registry"},
 	{"logout", "Log out from a Docker registry"},
-	{"logs", "Fetch the logs of a container"},
 	{"network", "Manage Docker networks"},
 	{"network", "Manage Docker networks"},
 	{"pause", "Pause all processes within a container"},
 	{"pause", "Pause all processes within a container"},
 	{"port", "List port mappings or a specific mapping for the CONTAINER"},
 	{"port", "List port mappings or a specific mapping for the CONTAINER"},