From 4e88d9a9b0b50776f0591ccdb5e6944568d366f1 Mon Sep 17 00:00:00 2001 From: Seth Hoenig Date: Mon, 30 Jan 2023 12:17:56 -0600 Subject: [PATCH] docker: set force=true on remove image to handle images referenced by multiple tags This PR changes our call of docker client RemoveImage() to RemoveImageExtended with the Force=true option set. This fixes a bug where an image referenced by more than one tag could never be garbage collected by Nomad. The Force option only applies to stopped containers; it does not affect running workloads. --- .changelog/15962.txt | 3 +++ drivers/docker/coordinator.go | 6 ++++-- drivers/docker/coordinator_test.go | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changelog/15962.txt diff --git a/.changelog/15962.txt b/.changelog/15962.txt new file mode 100644 index 000000000000..602aedc969d9 --- /dev/null +++ b/.changelog/15962.txt @@ -0,0 +1,3 @@ +```release-note:bug +docker: Fixed a bug where images referenced by multiple tags would not be GC'd +``` diff --git a/drivers/docker/coordinator.go b/drivers/docker/coordinator.go index 7a99acdb3f27..edbaf0f63c62 100644 --- a/drivers/docker/coordinator.go +++ b/drivers/docker/coordinator.go @@ -59,7 +59,7 @@ func (p *pullFuture) set(imageID string, err error) { type DockerImageClient interface { PullImage(opts docker.PullImageOptions, auth docker.AuthConfiguration) error InspectImage(id string) (*docker.Image, error) - RemoveImage(id string) error + RemoveImageExtended(id string, opts docker.RemoveImageOptions) error } // LogEventFn is a callback which allows Drivers to emit task events. @@ -320,7 +320,9 @@ func (d *dockerCoordinator) removeImageImpl(id string, ctx context.Context) { d.imageLock.Unlock() for i := 0; i < 3; i++ { - err := d.client.RemoveImage(id) + err := d.client.RemoveImageExtended(id, docker.RemoveImageOptions{ + Force: true, // necessary to GC images referenced by multiple tags + }) if err == nil { break } diff --git a/drivers/docker/coordinator_test.go b/drivers/docker/coordinator_test.go index 755c6b99e54e..0e08551e1eaa 100644 --- a/drivers/docker/coordinator_test.go +++ b/drivers/docker/coordinator_test.go @@ -48,7 +48,7 @@ func (m *mockImageClient) InspectImage(id string) (*docker.Image, error) { }, nil } -func (m *mockImageClient) RemoveImage(id string) error { +func (m *mockImageClient) RemoveImageExtended(id string, options docker.RemoveImageOptions) error { m.lock.Lock() defer m.lock.Unlock() m.removed[id]++