diff --git a/cmd/compose/compose.go b/cmd/compose/compose.go index c20d1507bb..f432d7c020 100644 --- a/cmd/compose/compose.go +++ b/cmd/compose/compose.go @@ -458,6 +458,7 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { // copyCommand(&opts, dockerCli, backend), waitCommand(&opts, dockerCli, backend), scaleCommand(&opts, dockerCli, backend), + statsCommand(&opts, dockerCli), watchCommand(&opts, dockerCli, backend), alphaCommand(&opts, dockerCli, backend), ) diff --git a/cmd/compose/stats.go b/cmd/compose/stats.go new file mode 100644 index 0000000000..c6c2f7fed0 --- /dev/null +++ b/cmd/compose/stats.go @@ -0,0 +1,84 @@ +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package compose + +import ( + "context" + "fmt" + + "github.com/docker/cli/cli/command" + "github.com/docker/cli/cli/command/container" + "github.com/docker/docker/api/types/filters" + "github.com/spf13/cobra" + + "github.com/docker/compose/v2/pkg/api" +) + +type statsOptions struct { + ProjectOptions *ProjectOptions + all bool + format string + noStream bool + noTrunc bool +} + +func statsCommand(p *ProjectOptions, dockerCli command.Cli) *cobra.Command { + opts := statsOptions{ + ProjectOptions: p, + } + cmd := &cobra.Command{ + Use: "stats [OPTIONS] [SERVICE]", + Short: "Display a live stream of container(s) resource usage statistics", + Args: cobra.MaximumNArgs(1), + RunE: Adapt(func(ctx context.Context, args []string) error { + return runStats(ctx, dockerCli, opts, args) + }), + ValidArgsFunction: completeServiceNames(dockerCli, p), + } + flags := cmd.Flags() + flags.BoolVarP(&opts.all, "all", "a", false, "Show all containers (default shows just running)") + flags.StringVar(&opts.format, "format", "", `Format output using a custom template: +'table': Print output in table format with column headers (default) +'table TEMPLATE': Print output in table format using the given Go template +'json': Print in JSON format +'TEMPLATE': Print output using the given Go template. +Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates`) + flags.BoolVar(&opts.noStream, "no-stream", false, "Disable streaming stats and only pull the first result") + flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate output") + return cmd +} + +func runStats(ctx context.Context, dockerCli command.Cli, opts statsOptions, service []string) error { + name, err := opts.ProjectOptions.toProjectName(dockerCli) + if err != nil { + return err + } + filter := []filters.KeyValuePair{ + filters.Arg("label", fmt.Sprintf("%s=%s", api.ProjectLabel, name)), + } + if len(service) > 0 { + filter = append(filter, filters.Arg("label", fmt.Sprintf("%s=%s", api.ServiceLabel, service[0]))) + } + args := filters.NewArgs(filter...) + return container.RunStats(ctx, dockerCli, &container.StatsOptions{ + All: opts.all, + NoStream: opts.noStream, + NoTrunc: opts.noTrunc, + Format: opts.format, + Filters: &args, + }) +} diff --git a/docs/reference/compose.md b/docs/reference/compose.md index 46df7b832e..a7508f85d4 100644 --- a/docs/reference/compose.md +++ b/docs/reference/compose.md @@ -28,6 +28,7 @@ Define and run multi-container applications with Docker. | [`run`](compose_run.md) | Run a one-off command on a service. | | [`scale`](compose_scale.md) | Scale services | | [`start`](compose_start.md) | Start services | +| [`stats`](compose_stats.md) | Display a live stream of container(s) resource usage statistics | | [`stop`](compose_stop.md) | Stop services | | [`top`](compose_top.md) | Display the running processes | | [`unpause`](compose_unpause.md) | Unpause services | diff --git a/docs/reference/compose_stats.md b/docs/reference/compose_stats.md new file mode 100644 index 0000000000..acb22840b3 --- /dev/null +++ b/docs/reference/compose_stats.md @@ -0,0 +1,18 @@ +# docker compose stats + + +Display a live stream of container(s) resource usage statistics + +### Options + +| Name | Type | Default | Description | +|:--------------|:---------|:--------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `-a`, `--all` | | | Show all containers (default shows just running) | +| `--dry-run` | | | Execute command in dry run mode | +| `--format` | `string` | | Format output using a custom template:
'table': Print output in table format with column headers (default)
'table TEMPLATE': Print output in table format using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates | +| `--no-stream` | | | Disable streaming stats and only pull the first result | +| `--no-trunc` | | | Do not truncate output | + + + + diff --git a/docs/reference/docker_compose.yaml b/docs/reference/docker_compose.yaml index c096f89230..ef9a95247f 100644 --- a/docs/reference/docker_compose.yaml +++ b/docs/reference/docker_compose.yaml @@ -167,6 +167,7 @@ cname: - docker compose run - docker compose scale - docker compose start + - docker compose stats - docker compose stop - docker compose top - docker compose unpause @@ -196,6 +197,7 @@ clink: - docker_compose_run.yaml - docker_compose_scale.yaml - docker_compose_start.yaml + - docker_compose_stats.yaml - docker_compose_stop.yaml - docker_compose_top.yaml - docker_compose_unpause.yaml diff --git a/docs/reference/docker_compose_stats.yaml b/docs/reference/docker_compose_stats.yaml new file mode 100644 index 0000000000..cd8e801b32 --- /dev/null +++ b/docs/reference/docker_compose_stats.yaml @@ -0,0 +1,71 @@ +command: docker compose stats +short: Display a live stream of container(s) resource usage statistics +long: Display a live stream of container(s) resource usage statistics +usage: docker compose stats [OPTIONS] [SERVICE] +pname: docker compose +plink: docker_compose.yaml +options: + - option: all + shorthand: a + value_type: bool + default_value: "false" + description: Show all containers (default shows just running) + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: format + value_type: string + description: |- + Format output using a custom template: + 'table': Print output in table format with column headers (default) + 'table TEMPLATE': Print output in table format using the given Go template + 'json': Print in JSON format + 'TEMPLATE': Print output using the given Go template. + Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: no-stream + value_type: bool + default_value: "false" + description: Disable streaming stats and only pull the first result + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: no-trunc + value_type: bool + default_value: "false" + description: Do not truncate output + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +inherited_options: + - option: dry-run + value_type: bool + default_value: "false" + description: Execute command in dry run mode + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +deprecated: false +hidden: false +experimental: false +experimentalcli: false +kubernetes: false +swarm: false +