From 0d9d187f3186ef9c311bf2d99ddec65086281ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gronowski?= Date: Mon, 17 Mar 2025 13:49:36 +0100 Subject: [PATCH] image/inspect: Add --platform flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Paweł Gronowski --- cli/command/image/inspect.go | 31 +++++++++++++++++++-- docs/reference/commandline/image_inspect.md | 1 + 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/cli/command/image/inspect.go b/cli/command/image/inspect.go index ece81cae71..0624268d0d 100644 --- a/cli/command/image/inspect.go +++ b/cli/command/image/inspect.go @@ -7,6 +7,7 @@ import ( "bytes" "context" + "github.com/containerd/platforms" "github.com/docker/cli/cli" "github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command/completion" @@ -14,12 +15,14 @@ import ( flagsHelper "github.com/docker/cli/cli/flags" "github.com/docker/docker/api/types/image" "github.com/docker/docker/client" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/spf13/cobra" ) type inspectOptions struct { - format string - refs []string + format string + refs []string + platform string } // newInspectCommand creates a new cobra.Command for `docker image inspect` @@ -39,14 +42,36 @@ func newInspectCommand(dockerCli command.Cli) *cobra.Command { flags := cmd.Flags() flags.StringVarP(&opts.format, "format", "f", "", flagsHelper.InspectFormatHelp) + + // Don't default to DOCKER_DEFAULT_PLATFORM env variable, always default to + // inspecting the image as-is. This also avoids forcing the platform selection + // on older APIs which don't support it. + flags.StringVar(&opts.platform, "platform", "", `Inspect a specific platform of the multi-platform image. +If the image or the server is not multi-platform capable, the command will error out if the platform does not match. +'os[/arch[/variant]]': Explicit platform (eg. linux/amd64)`) + flags.SetAnnotation("platform", "version", []string{"1.49"}) + + _ = cmd.RegisterFlagCompletionFunc("platform", completion.Platforms) return cmd } func runInspect(ctx context.Context, dockerCLI command.Cli, opts inspectOptions) error { + var platform *ocispec.Platform + if opts.platform != "" { + p, err := platforms.Parse(opts.platform) + if err != nil { + return err + } + platform = &p + } + apiClient := dockerCLI.Client() return inspect.Inspect(dockerCLI.Out(), opts.refs, opts.format, func(ref string) (any, []byte, error) { var buf bytes.Buffer - resp, err := apiClient.ImageInspect(ctx, ref, client.ImageInspectWithRawResponse(&buf)) + resp, err := apiClient.ImageInspect(ctx, ref, + client.ImageInspectWithRawResponse(&buf), + client.ImageInspectWithPlatform(platform), + ) if err != nil { return image.InspectResponse{}, nil, err } diff --git a/docs/reference/commandline/image_inspect.md b/docs/reference/commandline/image_inspect.md index 1f59b0014d..74da0bee2c 100644 --- a/docs/reference/commandline/image_inspect.md +++ b/docs/reference/commandline/image_inspect.md @@ -8,6 +8,7 @@ Display detailed information on one or more images | Name | Type | Default | Description | |:-----------------|:---------|:--------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-f`, `--format` | `string` | | Format output using a custom 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 | +| `--platform` | `string` | | Inspect a specific platform of the multi-platform image.
If the image or the server is not multi-platform capable, the command will error out if the platform does not match.
'os[/arch[/variant]]': Explicit platform (eg. linux/amd64) |