From 4c8f9ebc3264cb3355b1a913f6e8ffd9001341ba Mon Sep 17 00:00:00 2001 From: Mohammed Thaha Date: Mon, 6 Apr 2026 02:26:36 +0530 Subject: [PATCH] container/ps: add HealthCheck formatter field Signed-off-by: Mohammed Thaha --- cli/command/formatter/container.go | 23 ++++++++++++++++++++++ cli/command/formatter/container_test.go | 4 ++++ docs/reference/commandline/container_ls.md | 1 + 3 files changed, 28 insertions(+) diff --git a/cli/command/formatter/container.go b/cli/command/formatter/container.go index e17313a6dc12..3c75f1b13b8d 100644 --- a/cli/command/formatter/container.go +++ b/cli/command/formatter/container.go @@ -28,6 +28,7 @@ const ( localVolumes = "LOCAL VOLUMES" networksHeader = "NETWORKS" platformHeader = "PLATFORM" + healthCheckHeader = "HEALTHCHECK" ) // Platform wraps a [ocispec.Platform] to implement the stringer interface. @@ -121,6 +122,7 @@ func NewContainerContext() *ContainerContext { "LocalVolumes": localVolumes, "Networks": networksHeader, "Platform": platformHeader, + "HealthCheck": healthCheckHeader, } return &containerCtx } @@ -352,6 +354,27 @@ func (c *ContainerContext) Networks() string { return strings.Join(networks, ",") } +// HealthCheck returns the container's health status (for example, "healthy","unhealthy", or "starting"). +// If no healthcheck is configured, an empty +// string is returned. +func (c *ContainerContext) HealthCheck() string { + if c.c.Health != nil && c.c.Health.Status != "" { + return string(c.c.Health.Status) + } + + // Fallback for daemons/API versions that include health only in Status text. + switch { + case strings.HasSuffix(c.c.Status, "(healthy)"): + return string(container.Healthy) + case strings.HasSuffix(c.c.Status, "(unhealthy)"): + return string(container.Unhealthy) + case strings.HasSuffix(c.c.Status, "(health: starting)"): + return string(container.Starting) + } + + return "" +} + // DisplayablePorts returns formatted string representing open ports of container // e.g. "0.0.0.0:80->9090/tcp, 9988/tcp" // it's used by command 'docker ps' diff --git a/cli/command/formatter/container_test.go b/cli/command/formatter/container_test.go index fe7b57dd7f52..66c06afe9e33 100644 --- a/cli/command/formatter/container_test.go +++ b/cli/command/formatter/container_test.go @@ -494,6 +494,7 @@ func TestContainerContextWriteJSON(t *testing.T) { { "Command": `""`, "CreatedAt": expectedCreated, + "HealthCheck": "", "ID": "containerID1", "Image": "ubuntu", "Labels": "", @@ -511,6 +512,7 @@ func TestContainerContextWriteJSON(t *testing.T) { { "Command": `""`, "CreatedAt": expectedCreated, + "HealthCheck": "", "ID": "containerID2", "Image": "ubuntu", "Labels": "", @@ -528,6 +530,7 @@ func TestContainerContextWriteJSON(t *testing.T) { { "Command": `""`, "CreatedAt": expectedCreated, + "HealthCheck": "", "ID": "containerID3", "Image": "ubuntu", "Labels": "", @@ -615,6 +618,7 @@ func TestContainerBackCompat(t *testing.T) { {field: "Image", expected: "docker.io/library/ubuntu"}, {field: "Command", expected: `"/bin/sh"`}, {field: "CreatedAt", expected: time.Unix(createdAtTime.Unix(), 0).String()}, + {field: "HealthCheck", expected: ""}, {field: "RunningFor", expected: "12 months ago"}, {field: "Ports", expected: "8080/tcp"}, {field: "Status", expected: "running"}, diff --git a/docs/reference/commandline/container_ls.md b/docs/reference/commandline/container_ls.md index a19f7a5e0410..bc2dd75049bb 100644 --- a/docs/reference/commandline/container_ls.md +++ b/docs/reference/commandline/container_ls.md @@ -405,6 +405,7 @@ Valid placeholders for the Go template are listed below: | `.Ports` | Exposed ports. | | `.State` | Container status (for example; "created", "running", "exited"). | | `.Status` | Container status with details about duration and health-status. | +| `.HealthCheck`| Container health status ("starting", "healthy", "unhealthy", or "none"; empty when unavailable).| | `.Size` | Container disk size. | | `.Names` | Container names. | | `.Labels` | All labels assigned to the container. |