From 54bf220a16a9f935eb661b50afa48c66a17a9de5 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Thu, 15 May 2025 11:58:13 +0200 Subject: [PATCH 1/6] vendor: github.com/docker/docker fd1a78e0a388 (master, v28.x dev) full diff: https://github.com/docker/docker/compare/cb38cc0fdd555eae6c53be1c427c0a28d52965f6...fd1a78e0a388c92d1a61b6bb159d5cba37c53349 Signed-off-by: Sebastiaan van Stijn --- vendor.mod | 2 +- vendor.sum | 4 +-- .../docker/api/types/container/container.go | 4 +-- .../docker/api/types/container/state.go | 35 +++++++++++++++++++ .../docker/docker/client/request.go | 2 +- .../docker/docker/errdefs/http_helpers.go | 6 ++-- vendor/modules.txt | 2 +- 7 files changed, 45 insertions(+), 10 deletions(-) diff --git a/vendor.mod b/vendor.mod index e9bfd38628fa..634170b5360d 100644 --- a/vendor.mod +++ b/vendor.mod @@ -14,7 +14,7 @@ require ( github.com/distribution/reference v0.6.0 github.com/docker/cli-docs-tool v0.9.0 github.com/docker/distribution v2.8.3+incompatible - github.com/docker/docker v28.1.2-0.20250512131816-cb38cc0fdd55+incompatible // master, v28.x dev + github.com/docker/docker v28.1.2-0.20250515215111-fd1a78e0a388+incompatible // master, v28.x dev github.com/docker/docker-credential-helpers v0.9.3 github.com/docker/go-connections v0.5.0 github.com/docker/go-units v0.5.0 diff --git a/vendor.sum b/vendor.sum index ab20018b5481..a490d3207032 100644 --- a/vendor.sum +++ b/vendor.sum @@ -53,8 +53,8 @@ github.com/docker/cli-docs-tool v0.9.0/go.mod h1:ClrwlNW+UioiRyH9GiAOe1o3J/TsY3T github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v28.1.2-0.20250512131816-cb38cc0fdd55+incompatible h1:O65IbOqdNmZ8B9YyHAzKscG9XuQkzPFD2SX/JhCHkBk= -github.com/docker/docker v28.1.2-0.20250512131816-cb38cc0fdd55+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v28.1.2-0.20250515215111-fd1a78e0a388+incompatible h1:t6fp4pyFO9bUagzR2mxee6JdTAv5SJmqwMGUlllS7Hc= +github.com/docker/docker v28.1.2-0.20250515215111-fd1a78e0a388+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= diff --git a/vendor/github.com/docker/docker/api/types/container/container.go b/vendor/github.com/docker/docker/api/types/container/container.go index 65fabbf425c5..a191ca8bdb73 100644 --- a/vendor/github.com/docker/docker/api/types/container/container.go +++ b/vendor/github.com/docker/docker/api/types/container/container.go @@ -104,7 +104,7 @@ type MountPoint struct { // State stores container's running state // it's part of ContainerJSONBase and returned by "inspect" command type State struct { - Status string // String representation of the container state. Can be one of "created", "running", "paused", "restarting", "removing", "exited", or "dead" + Status ContainerState // String representation of the container state. Can be one of "created", "running", "paused", "restarting", "removing", "exited", or "dead" Running bool Paused bool Restarting bool @@ -132,7 +132,7 @@ type Summary struct { SizeRw int64 `json:",omitempty"` SizeRootFs int64 `json:",omitempty"` Labels map[string]string - State string + State ContainerState Status string HostConfig struct { NetworkMode string `json:",omitempty"` diff --git a/vendor/github.com/docker/docker/api/types/container/state.go b/vendor/github.com/docker/docker/api/types/container/state.go index e5b0ecb3f55a..78d5c4fe85c7 100644 --- a/vendor/github.com/docker/docker/api/types/container/state.go +++ b/vendor/github.com/docker/docker/api/types/container/state.go @@ -1,5 +1,40 @@ package container +import ( + "fmt" + "strings" +) + +// ContainerState is a string representation of the container's current state. +// +// It currently is an alias for string, but may become a distinct type in the future. +type ContainerState = string + +const ( + StateCreated ContainerState = "created" // StateCreated indicates the container is created, but not (yet) started. + StateRunning ContainerState = "running" // StateRunning indicates that the container is running. + StatePaused ContainerState = "paused" // StatePaused indicates that the container's current state is paused. + StateRestarting ContainerState = "restarting" // StateRestarting indicates that the container is currently restarting. + StateRemoving ContainerState = "removing" // StateRemoving indicates that the container is being removed. + StateExited ContainerState = "exited" // StateExited indicates that the container exited. + StateDead ContainerState = "dead" // StateDead indicates that the container failed to be deleted. Containers in this state are attempted to be cleaned up when the daemon restarts. +) + +var validStates = []ContainerState{ + StateCreated, StateRunning, StatePaused, StateRestarting, StateRemoving, StateExited, StateDead, +} + +// ValidateContainerState checks if the provided string is a valid +// container [ContainerState]. +func ValidateContainerState(s ContainerState) error { + switch s { + case StateCreated, StateRunning, StatePaused, StateRestarting, StateRemoving, StateExited, StateDead: + return nil + default: + return errInvalidParameter{error: fmt.Errorf("invalid value for state (%s): must be one of %s", s, strings.Join(validStates, ", "))} + } +} + // StateStatus is used to return container wait results. // Implements exec.ExitCode interface. // This type is needed as State include a sync.Mutex field which make diff --git a/vendor/github.com/docker/docker/client/request.go b/vendor/github.com/docker/docker/client/request.go index 4cc64350bdb5..dd95653a79b6 100644 --- a/vendor/github.com/docker/docker/client/request.go +++ b/vendor/github.com/docker/docker/client/request.go @@ -195,7 +195,7 @@ func (cli *Client) checkResponseErr(serverResp *http.Response) (retErr error) { if serverResp == nil { return nil } - if serverResp.StatusCode >= 200 && serverResp.StatusCode < 400 { + if serverResp.StatusCode >= http.StatusOK && serverResp.StatusCode < http.StatusBadRequest { return nil } defer func() { diff --git a/vendor/github.com/docker/docker/errdefs/http_helpers.go b/vendor/github.com/docker/docker/errdefs/http_helpers.go index 0a8fadd48f1f..53c18f2fe0a8 100644 --- a/vendor/github.com/docker/docker/errdefs/http_helpers.go +++ b/vendor/github.com/docker/docker/errdefs/http_helpers.go @@ -33,12 +33,12 @@ func FromStatusCode(err error, statusCode int) error { return System(err) default: switch { - case statusCode >= 200 && statusCode < 400: + case statusCode >= http.StatusOK && statusCode < http.StatusBadRequest: // it's a client error return err - case statusCode >= 400 && statusCode < 500: + case statusCode >= http.StatusBadRequest && statusCode < http.StatusInternalServerError: return InvalidParameter(err) - case statusCode >= 500 && statusCode < 600: + case statusCode >= http.StatusInternalServerError && statusCode < 600: return System(err) default: return Unknown(err) diff --git a/vendor/modules.txt b/vendor/modules.txt index 396fc2a6cd47..d7bb6518977c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -58,7 +58,7 @@ github.com/docker/distribution/registry/client/transport github.com/docker/distribution/registry/storage/cache github.com/docker/distribution/registry/storage/cache/memory github.com/docker/distribution/uuid -# github.com/docker/docker v28.1.2-0.20250512131816-cb38cc0fdd55+incompatible +# github.com/docker/docker v28.1.2-0.20250515215111-fd1a78e0a388+incompatible ## explicit github.com/docker/docker/api github.com/docker/docker/api/types From d1c76198ba467ab470ad7b7b9416d91ff0a35f95 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Thu, 15 May 2025 12:28:20 +0200 Subject: [PATCH 2/6] cli/command/formatter: TestContainerPsContext add test for State() Signed-off-by: Sebastiaan van Stijn --- cli/command/formatter/container_test.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cli/command/formatter/container_test.go b/cli/command/formatter/container_test.go index fd809a0acf83..bfdab9365889 100644 --- a/cli/command/formatter/container_test.go +++ b/cli/command/formatter/container_test.go @@ -106,11 +106,17 @@ func TestContainerPsContext(t *testing.T) { call: ctx.Ports, }, { - container: container.Summary{Status: "RUNNING"}, + container: container.Summary{Status: "Up 123 seconds"}, trunc: true, - expValue: "RUNNING", + expValue: "Up 123 seconds", call: ctx.Status, }, + { + container: container.Summary{State: container.StateRunning}, + trunc: true, + expValue: container.StateRunning, + call: ctx.State, + }, { container: container.Summary{SizeRw: 10}, trunc: true, From c9d04c770add8868ff57d5c73ab8408edceec356 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Thu, 15 May 2025 12:31:19 +0200 Subject: [PATCH 3/6] cli/command/formatter: touch-up godoc for ContainerContext.State() Signed-off-by: Sebastiaan van Stijn --- cli/command/formatter/container.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/command/formatter/container.go b/cli/command/formatter/container.go index 71087b91d3c2..4e5a1cd750c7 100644 --- a/cli/command/formatter/container.go +++ b/cli/command/formatter/container.go @@ -218,7 +218,8 @@ func (c *ContainerContext) Ports() string { return DisplayablePorts(c.c.Ports) } -// State returns the container's current state (e.g. "running" or "paused") +// State returns the container's current state (e.g. "running" or "paused"). +// Refer to [container.ContainerState] for possible states. func (c *ContainerContext) State() string { return c.c.State } From 21e96eaaa72f6798dadb1f6f5829151c9f6dd8f8 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Thu, 15 May 2025 12:49:56 +0200 Subject: [PATCH 4/6] cli/command/completion: use ContainerState consts in tests Signed-off-by: Sebastiaan van Stijn --- cli/command/completion/functions_test.go | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/cli/command/completion/functions_test.go b/cli/command/completion/functions_test.go index 077a2f066213..12cd0ce425ee 100644 --- a/cli/command/completion/functions_test.go +++ b/cli/command/completion/functions_test.go @@ -82,9 +82,9 @@ func TestCompleteContainerNames(t *testing.T) { doc: "all containers", showAll: true, containers: []container.Summary{ - {ID: "id-c", State: "running", Names: []string{"/container-c", "/container-c/link-b"}}, - {ID: "id-b", State: "created", Names: []string{"/container-b"}}, - {ID: "id-a", State: "exited", Names: []string{"/container-a"}}, + {ID: "id-c", State: container.StateRunning, Names: []string{"/container-c", "/container-c/link-b"}}, + {ID: "id-b", State: container.StateCreated, Names: []string{"/container-b"}}, + {ID: "id-a", State: container.StateExited, Names: []string{"/container-a"}}, }, expOut: []string{"container-c", "container-c/link-b", "container-b", "container-a"}, expOpts: container.ListOptions{All: true}, @@ -95,9 +95,9 @@ func TestCompleteContainerNames(t *testing.T) { showAll: true, showIDs: true, containers: []container.Summary{ - {ID: "id-c", State: "running", Names: []string{"/container-c", "/container-c/link-b"}}, - {ID: "id-b", State: "created", Names: []string{"/container-b"}}, - {ID: "id-a", State: "exited", Names: []string{"/container-a"}}, + {ID: "id-c", State: container.StateRunning, Names: []string{"/container-c", "/container-c/link-b"}}, + {ID: "id-b", State: container.StateCreated, Names: []string{"/container-b"}}, + {ID: "id-a", State: container.StateExited, Names: []string{"/container-a"}}, }, expOut: []string{"id-c", "container-c", "container-c/link-b", "id-b", "container-b", "id-a", "container-a"}, expOpts: container.ListOptions{All: true}, @@ -107,7 +107,7 @@ func TestCompleteContainerNames(t *testing.T) { doc: "only running containers", showAll: false, containers: []container.Summary{ - {ID: "id-c", State: "running", Names: []string{"/container-c", "/container-c/link-b"}}, + {ID: "id-c", State: container.StateRunning, Names: []string{"/container-c", "/container-c/link-b"}}, }, expOut: []string{"container-c", "container-c/link-b"}, expDirective: cobra.ShellCompDirectiveNoFileComp, @@ -116,12 +116,12 @@ func TestCompleteContainerNames(t *testing.T) { doc: "with filter", showAll: true, filters: []func(container.Summary) bool{ - func(container container.Summary) bool { return container.State == "created" }, + func(ctr container.Summary) bool { return ctr.State == container.StateCreated }, }, containers: []container.Summary{ - {ID: "id-c", State: "running", Names: []string{"/container-c", "/container-c/link-b"}}, - {ID: "id-b", State: "created", Names: []string{"/container-b"}}, - {ID: "id-a", State: "exited", Names: []string{"/container-a"}}, + {ID: "id-c", State: container.StateRunning, Names: []string{"/container-c", "/container-c/link-b"}}, + {ID: "id-b", State: container.StateCreated, Names: []string{"/container-b"}}, + {ID: "id-a", State: container.StateExited, Names: []string{"/container-a"}}, }, expOut: []string{"container-b"}, expOpts: container.ListOptions{All: true}, @@ -131,13 +131,13 @@ func TestCompleteContainerNames(t *testing.T) { doc: "multiple filters", showAll: true, filters: []func(container.Summary) bool{ - func(container container.Summary) bool { return container.ID == "id-a" }, - func(container container.Summary) bool { return container.State == "created" }, + func(ctr container.Summary) bool { return ctr.ID == "id-a" }, + func(ctr container.Summary) bool { return ctr.State == container.StateCreated }, }, containers: []container.Summary{ - {ID: "id-c", State: "running", Names: []string{"/container-c", "/container-c/link-b"}}, - {ID: "id-b", State: "created", Names: []string{"/container-b"}}, - {ID: "id-a", State: "created", Names: []string{"/container-a"}}, + {ID: "id-c", State: container.StateRunning, Names: []string{"/container-c", "/container-c/link-b"}}, + {ID: "id-b", State: container.StateCreated, Names: []string{"/container-b"}}, + {ID: "id-a", State: container.StateCreated, Names: []string{"/container-a"}}, }, expOut: []string{"container-a"}, expOpts: container.ListOptions{All: true}, From 6fd9c57744884ed4fefb992370988e8f7da9dcd0 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Thu, 15 May 2025 12:50:47 +0200 Subject: [PATCH 5/6] cli/command/container: use ContainerState consts Signed-off-by: Sebastiaan van Stijn --- cli/command/container/attach.go | 2 +- cli/command/container/exec.go | 2 +- cli/command/container/pause.go | 2 +- cli/command/container/rm.go | 2 +- cli/command/container/start.go | 2 +- cli/command/container/unpause.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/command/container/attach.go b/cli/command/container/attach.go index a4dbe0ec0d11..f5ee5cf31115 100644 --- a/cli/command/container/attach.go +++ b/cli/command/container/attach.go @@ -56,7 +56,7 @@ func NewAttachCommand(dockerCLI command.Cli) *cobra.Command { "aliases": "docker container attach, docker attach", }, ValidArgsFunction: completion.ContainerNames(dockerCLI, false, func(ctr container.Summary) bool { - return ctr.State != "paused" + return ctr.State != container.StatePaused }), } diff --git a/cli/command/container/exec.go b/cli/command/container/exec.go index 00f58ede1866..7d521700a573 100644 --- a/cli/command/container/exec.go +++ b/cli/command/container/exec.go @@ -53,7 +53,7 @@ func NewExecCommand(dockerCli command.Cli) *cobra.Command { return RunExec(cmd.Context(), dockerCli, containerIDorName, options) }, ValidArgsFunction: completion.ContainerNames(dockerCli, false, func(ctr container.Summary) bool { - return ctr.State != "paused" + return ctr.State != container.StatePaused }), Annotations: map[string]string{ "category-top": "2", diff --git a/cli/command/container/pause.go b/cli/command/container/pause.go index b2a40aa70569..78dc6fe37d8d 100644 --- a/cli/command/container/pause.go +++ b/cli/command/container/pause.go @@ -32,7 +32,7 @@ func NewPauseCommand(dockerCli command.Cli) *cobra.Command { "aliases": "docker container pause, docker pause", }, ValidArgsFunction: completion.ContainerNames(dockerCli, false, func(ctr container.Summary) bool { - return ctr.State != "paused" + return ctr.State != container.StatePaused }), } } diff --git a/cli/command/container/rm.go b/cli/command/container/rm.go index 627b042f0ba2..4295f9e3826e 100644 --- a/cli/command/container/rm.go +++ b/cli/command/container/rm.go @@ -39,7 +39,7 @@ func NewRmCommand(dockerCli command.Cli) *cobra.Command { "aliases": "docker container rm, docker container remove, docker rm", }, ValidArgsFunction: completion.ContainerNames(dockerCli, true, func(ctr container.Summary) bool { - return opts.force || ctr.State == "exited" || ctr.State == "created" + return opts.force || ctr.State == container.StateExited || ctr.State == container.StateCreated }), } diff --git a/cli/command/container/start.go b/cli/command/container/start.go index 29aaa988d6b8..a71bdc8fde65 100644 --- a/cli/command/container/start.go +++ b/cli/command/container/start.go @@ -43,7 +43,7 @@ func NewStartCommand(dockerCli command.Cli) *cobra.Command { "aliases": "docker container start, docker start", }, ValidArgsFunction: completion.ContainerNames(dockerCli, true, func(ctr container.Summary) bool { - return ctr.State == "exited" || ctr.State == "created" + return ctr.State == container.StateExited || ctr.State == container.StateCreated }), } diff --git a/cli/command/container/unpause.go b/cli/command/container/unpause.go index 7824f4a76f78..fd5a516cace4 100644 --- a/cli/command/container/unpause.go +++ b/cli/command/container/unpause.go @@ -32,7 +32,7 @@ func NewUnpauseCommand(dockerCli command.Cli) *cobra.Command { "aliases": "docker container unpause, docker unpause", }, ValidArgsFunction: completion.ContainerNames(dockerCli, false, func(ctr container.Summary) bool { - return ctr.State == "paused" + return ctr.State == container.StatePaused }), } return cmd From 218c7ad958148e4cb4115f7220ee27c49aa06e25 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Thu, 15 May 2025 12:51:06 +0200 Subject: [PATCH 6/6] cli/command/formatter: use ContainerState consts Signed-off-by: Sebastiaan van Stijn --- cli/command/formatter/container_test.go | 8 ++++---- cli/command/formatter/disk_usage.go | 13 +++++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cli/command/formatter/container_test.go b/cli/command/formatter/container_test.go index bfdab9365889..126991222a1b 100644 --- a/cli/command/formatter/container_test.go +++ b/cli/command/formatter/container_test.go @@ -352,8 +352,8 @@ size: 0B } containers := []container.Summary{ - {ID: "containerID1", Names: []string{"/foobar_baz"}, Image: "ubuntu", Created: unixTime, State: "running"}, - {ID: "containerID2", Names: []string{"/foobar_bar"}, Image: "ubuntu", Created: unixTime, State: "running"}, + {ID: "containerID1", Names: []string{"/foobar_baz"}, Image: "ubuntu", Created: unixTime, State: container.StateRunning}, + {ID: "containerID2", Names: []string{"/foobar_bar"}, Image: "ubuntu", Created: unixTime, State: container.StateRunning}, } for _, tc := range cases { @@ -434,8 +434,8 @@ func TestContainerContextWriteWithNoContainers(t *testing.T) { func TestContainerContextWriteJSON(t *testing.T) { unix := time.Now().Add(-65 * time.Second).Unix() containers := []container.Summary{ - {ID: "containerID1", Names: []string{"/foobar_baz"}, Image: "ubuntu", Created: unix, State: "running"}, - {ID: "containerID2", Names: []string{"/foobar_bar"}, Image: "ubuntu", Created: unix, State: "running"}, + {ID: "containerID1", Names: []string{"/foobar_baz"}, Image: "ubuntu", Created: unix, State: container.StateRunning}, + {ID: "containerID2", Names: []string{"/foobar_bar"}, Image: "ubuntu", Created: unix, State: container.StateRunning}, } expectedCreated := time.Unix(unix, 0).String() expectedJSONs := []map[string]any{ diff --git a/cli/command/formatter/disk_usage.go b/cli/command/formatter/disk_usage.go index 1199d571f3d6..f0fb4e1f2cce 100644 --- a/cli/command/formatter/disk_usage.go +++ b/cli/command/formatter/disk_usage.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "strconv" - "strings" "text/template" "github.com/distribution/reference" @@ -330,9 +329,15 @@ func (c *diskUsageContainersContext) TotalCount() string { } func (*diskUsageContainersContext) isActive(ctr container.Summary) bool { - return strings.Contains(ctr.State, "running") || - strings.Contains(ctr.State, "paused") || - strings.Contains(ctr.State, "restarting") + switch ctr.State { + case container.StateRunning, container.StatePaused, container.StateRestarting: + return true + case container.StateCreated, container.StateRemoving, container.StateExited, container.StateDead: + return false + default: + // Unknown state (should never happen). + return false + } } func (c *diskUsageContainersContext) Active() string {