Skip to content

Commit

Permalink
image rm: allow for force-remove infra images
Browse files Browse the repository at this point in the history
Force removal of images will also remove associated containers.
Historically, infra containers have been excluded resulting in
rather annoying errors, for instance, when running `rmi -af`.

Since there is not reasons to exclude infra containers, allow for
removing the entire pod when an infra image is force removed.

Signed-off-by: Valentin Rothberg <[email protected]>
  • Loading branch information
vrothberg committed Dec 17, 2021
1 parent 91e55e2 commit 12d762f
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 3 deletions.
17 changes: 14 additions & 3 deletions libpod/runtime_img.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,21 @@ func (r *Runtime) RemoveContainersForImageCallback(ctx context.Context) libimage
return err
}
for _, ctr := range ctrs {
if ctr.config.RootfsImageID == imageID {
var timeout *uint
if ctr.config.RootfsImageID != imageID {
continue
}
var timeout *uint
if ctr.config.IsInfra {
pod, err := r.state.Pod(ctr.config.Pod)
if err != nil {
return errors.Wrapf(err, "container %s is in pod %s, but pod cannot be retrieved", ctr.ID(), pod.ID())
}
if err := r.removePod(ctx, pod, true, true, timeout); err != nil {
return errors.Wrapf(err, "removing image %s: container %s using image could not be removed", imageID, ctr.ID())
}
} else {
if err := r.removeContainer(ctx, ctr, true, false, false, timeout); err != nil {
return errors.Wrapf(err, "error removing image %s: container %s using image could not be removed", imageID, ctr.ID())
return errors.Wrapf(err, "removing image %s: container %s using image could not be removed", imageID, ctr.ID())
}
}
}
Expand Down
60 changes: 60 additions & 0 deletions test/system/010-images.bats
Original file line number Diff line number Diff line change
Expand Up @@ -240,4 +240,64 @@ Labels.created_at | 20[0-9-]\\\+T[0-9:]\\\+Z

run_podman rmi test:1.0
}

@test "podman images - rmi -af removes all containers and pods" {
pname=$(random_string)
run_podman create --pod new:$pname $IMAGE

run_podman inspect --format '{{.ID}}' $IMAGE
imageID=$output

run_podman version --format "{{.Server.Version}}-{{.Server.Built}}"
pauseImage=localhost/podman-pause:$output
run_podman inspect --format '{{.ID}}' $pauseImage
pauseID=$output

run_podman 2 rmi -a
is "$output" "Error: 2 errors occurred:
.** Image used by .*: image is in use by a container
.** Image used by .*: image is in use by a container"

run_podman rmi -af
is "$output" "Untagged: $IMAGE
Untagged: $pauseImage
Deleted: $imageID
Deleted: $pauseID" "infra images gets removed as well"

run_podman images --noheading
is "$output" ""
run_podman ps --all --noheading
is "$output" ""
run_podman pod ps --noheading
is "$output" ""

run_podman create --pod new:$pname $IMAGE
}

@test "podman images - rmi -f can remove infra images" {
pname=$(random_string)
run_podman create --pod new:$pname $IMAGE

run_podman version --format "{{.Server.Version}}-{{.Server.Built}}"
pauseImage=localhost/podman-pause:$output
run_podman inspect --format '{{.ID}}' $pauseImage
pauseID=$output

run_podman 2 rmi $pauseImage
is "$output" "Error: Image used by .* image is in use by a container"

run_podman rmi -f $pauseImage
is "$output" "Untagged: $pauseImage
Deleted: $pauseID"

# Force-removing the infra container removes the pod and all its containers.
run_podman ps --all --noheading
is "$output" ""
run_podman pod ps --noheading
is "$output" ""

# Other images are still present.
run_podman image exists $IMAGE
}

# vim: filetype=sh

0 comments on commit 12d762f

Please sign in to comment.