diff --git a/cli/command/formatter/container.go b/cli/command/formatter/container.go index 471ecf3888..01446efea5 100644 --- a/cli/command/formatter/container.go +++ b/cli/command/formatter/container.go @@ -170,27 +170,33 @@ func (c *ContainerContext) Image() string { if c.c.Image == "" { return "" } - if c.trunc { - if trunc := TruncateID(c.c.ImageID); trunc == TruncateID(c.c.Image) { - return trunc + if !c.trunc { + return c.c.Image + } + if trunc := TruncateID(c.c.ImageID); trunc == TruncateID(c.c.Image) { + return trunc + } + ref, err := reference.ParseNormalizedNamed(c.c.Image) + if err != nil { + return c.c.Image + } + + if _, ok := ref.(reference.Digested); ok { + // strip the digest, but preserve the tag (if any) + var tag string + if t, ok := ref.(reference.Tagged); ok { + tag = t.Tag() } - // truncate digest if no-trunc option was not selected - ref, err := reference.ParseNormalizedNamed(c.c.Image) - if err == nil { - if nt, ok := ref.(reference.NamedTagged); ok { - // case for when a tag is provided - if namedTagged, err := reference.WithTag(reference.TrimNamed(nt), nt.Tag()); err == nil { - return reference.FamiliarString(namedTagged) - } - } else { - // case for when a tag is not provided - named := reference.TrimNamed(ref) - return reference.FamiliarString(named) + ref = reference.TrimNamed(ref) + if tag != "" { + if out, err := reference.WithTag(ref, tag); err == nil { + ref = out } } } - return c.c.Image + // Format as "familiar" name with "docker.io[/library]" trimmed. + return reference.FamiliarString(ref) } // Command returns's the container's command. If the trunc option is set, the diff --git a/cli/command/formatter/container_test.go b/cli/command/formatter/container_test.go index 96626d29f0..b5a96950c1 100644 --- a/cli/command/formatter/container_test.go +++ b/cli/command/formatter/container_test.go @@ -54,14 +54,51 @@ func TestContainerPsContext(t *testing.T) { call: ctx.Image, }, { - container: container.Summary{Image: "verylongimagename"}, + container: container.Summary{Image: "ubuntu:latest"}, trunc: true, - expValue: "verylongimagename", + expValue: "ubuntu:latest", call: ctx.Image, }, { - container: container.Summary{Image: "verylongimagename"}, - expValue: "verylongimagename", + container: container.Summary{Image: "docker.io/library/ubuntu"}, + trunc: true, + expValue: "ubuntu", + call: ctx.Image, + }, + { + container: container.Summary{Image: "docker.io/library/ubuntu:latest"}, + trunc: true, + expValue: "ubuntu:latest", + call: ctx.Image, + }, + { + container: container.Summary{Image: "ubuntu:latest@sha256:a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5"}, + trunc: true, + expValue: "ubuntu:latest", + call: ctx.Image, + }, + { + container: container.Summary{Image: "ubuntu@sha256:a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5"}, + trunc: true, + expValue: "ubuntu", + call: ctx.Image, + }, + { + container: container.Summary{Image: "docker.io/library/ubuntu@sha256:a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5"}, + trunc: true, + expValue: "ubuntu", + call: ctx.Image, + }, + { + container: container.Summary{Image: "docker.io/library/ubuntu:latest@sha256:a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5"}, + trunc: true, + expValue: "ubuntu:latest", + call: ctx.Image, + }, + { + container: container.Summary{Image: "verylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagename"}, + trunc: true, + expValue: "verylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagename", call: ctx.Image, }, {