mirror of
https://github.com/containers/podman.git
synced 2025-12-02 19:28:58 +08:00
Merge pull request #17040 from giuseppe/podman-rm-f-no-processes
podman: podman rm -f doesn't leave processes
This commit is contained in:
@@ -429,6 +429,10 @@ func (r *ConmonOCIRuntime) StopContainer(ctr *Container, timeout uint, all bool)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := r.KillContainer(ctr, uint(unix.SIGKILL), all); err != nil {
|
if err := r.KillContainer(ctr, uint(unix.SIGKILL), all); err != nil {
|
||||||
|
// If the PID is 0, then the container is already stopped.
|
||||||
|
if ctr.state.PID == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
// Again, check if the container is gone. If it is, exit cleanly.
|
// Again, check if the container is gone. If it is, exit cleanly.
|
||||||
if aliveErr := unix.Kill(ctr.state.PID, 0); errors.Is(aliveErr, unix.ESRCH) {
|
if aliveErr := unix.Kill(ctr.state.PID, 0); errors.Is(aliveErr, unix.ESRCH) {
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -741,7 +741,7 @@ func (r *Runtime) removeContainer(ctx context.Context, c *Container, force, remo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check that the container's in a good state to be removed.
|
// Check that the container's in a good state to be removed.
|
||||||
if c.state.State == define.ContainerStateRunning {
|
if c.ensureState(define.ContainerStateRunning, define.ContainerStateStopping) {
|
||||||
time := c.StopTimeout()
|
time := c.StopTimeout()
|
||||||
if timeout != nil {
|
if timeout != nil {
|
||||||
time = *timeout
|
time = *timeout
|
||||||
|
|||||||
@@ -113,9 +113,8 @@ load helpers
|
|||||||
is "$output" "" "Should print no output"
|
is "$output" "" "Should print no output"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "podman container rm doesn't affect stopping containers" {
|
function __run_healthcheck_container() {
|
||||||
local cname=c$(random_string 30)
|
run_podman run -d --name $1 \
|
||||||
run_podman run -d --name $cname \
|
|
||||||
--health-cmd /bin/false \
|
--health-cmd /bin/false \
|
||||||
--health-interval 1s \
|
--health-interval 1s \
|
||||||
--health-retries 2 \
|
--health-retries 2 \
|
||||||
@@ -125,6 +124,11 @@ load helpers
|
|||||||
--health-start-period 0 \
|
--health-start-period 0 \
|
||||||
--stop-signal SIGTERM \
|
--stop-signal SIGTERM \
|
||||||
$IMAGE sleep infinity
|
$IMAGE sleep infinity
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "podman container rm doesn't affect stopping containers" {
|
||||||
|
local cname=c$(random_string 30)
|
||||||
|
__run_healthcheck_container $cname
|
||||||
local cid=$output
|
local cid=$output
|
||||||
|
|
||||||
# We'll use the PID later to confirm that container is not running
|
# We'll use the PID later to confirm that container is not running
|
||||||
@@ -159,4 +163,29 @@ load helpers
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "podman container rm --force doesn't leave running processes" {
|
||||||
|
local cname=c$(random_string 30)
|
||||||
|
__run_healthcheck_container $cname
|
||||||
|
local cid=$output
|
||||||
|
|
||||||
|
# We'll use the PID later to confirm that container is not running
|
||||||
|
run_podman inspect --format '{{.State.Pid}}' $cname
|
||||||
|
local pid=$output
|
||||||
|
|
||||||
|
for i in {1..10}; do
|
||||||
|
run_podman inspect $cname --format '{{.State.Status}}'
|
||||||
|
if [ "$output" = "stopping" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 0.5
|
||||||
|
done
|
||||||
|
|
||||||
|
run_podman rm -f $cname
|
||||||
|
|
||||||
|
if kill -0 $pid; then
|
||||||
|
die "Container $cname process is still running (pid $pid)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# vim: filetype=sh
|
# vim: filetype=sh
|
||||||
|
|||||||
Reference in New Issue
Block a user