package container import ( "strings" "testing" "time" "github.com/docker/cli/e2e/internal/fixtures" "gotest.tools/v3/icmd" "gotest.tools/v3/poll" ) func TestKillContainer(t *testing.T) { result := icmd.RunCommand("docker", "run", "-d", fixtures.AlpineImage, "top") result.Assert(t, icmd.Success) containerID := strings.TrimSpace(result.Stdout()) // Kill with SIGTERM should kill the process result = icmd.RunCmd(icmd.Command("docker", "kill", "-s", "SIGTERM", containerID)) result.Assert(t, icmd.Success) poll.WaitOn(t, containerStatus(t, containerID, "exited"), poll.WithDelay(100*time.Millisecond), poll.WithTimeout(5*time.Second)) // Kill on a stop container should return an error result = icmd.RunCmd(icmd.Command("docker", "kill", containerID)) result.Assert(t, icmd.Expected{ ExitCode: 1, Err: "is not running", }) } func containerStatus(t *testing.T, containerID, status string) func(poll.LogT) poll.Result { t.Helper() return func(poll.LogT) poll.Result { result := icmd.RunCommand("docker", "inspect", "-f", "{{ .State.Status }}", containerID) result.Assert(t, icmd.Success) actual := strings.TrimSpace(result.Stdout()) if actual == status { return poll.Success() } return poll.Continue("expected status %s != %s", status, actual) } }