From a5c8550a91c5eeda54d3a0428e70435fae7ddc17 Mon Sep 17 00:00:00 2001 From: Toshiki Sonoda Date: Tue, 17 Oct 2023 18:41:54 +0900 Subject: [PATCH] overlay: select additional image store path when using image store If parentBase path is additional image store, select the image contained in parentBase. Otherwise, the overlay storage driver may select another image store that does not contain the desired image, causing a "no suche file or directory" error. Fixes: https://github.com/containers/podman/issues/19748 Signed-off-by: Toshiki Sonoda --- drivers/overlay/overlay.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/overlay/overlay.go b/drivers/overlay/overlay.go index 525655331d..a8ce3f8ea5 100644 --- a/drivers/overlay/overlay.go +++ b/drivers/overlay/overlay.go @@ -1003,8 +1003,10 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable } } if parent != "" { - parentBase, parentImageStore, _ := d.dir2(parent) - if parentImageStore != "" { + parentBase, parentImageStore, inAdditionalStore := d.dir2(parent) + // If parentBase path is additional image store, select the image contained in parentBase. + // See https://github.com/containers/podman/issues/19748 + if parentImageStore != "" && !inAdditionalStore { parentBase = parentImageStore } st, err := system.Stat(filepath.Join(parentBase, "diff")) @@ -1079,12 +1081,13 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable } if parent != "" { - parentDir, parentImageStore, _ := d.dir2(parent) - base := parentDir - if parentImageStore != "" { - base = parentImageStore + parentBase, parentImageStore, inAdditionalStore := d.dir2(parent) + // If parentBase path is additional image store, select the image contained in parentBase. + // See https://github.com/containers/podman/issues/19748 + if parentImageStore != "" && !inAdditionalStore { + parentBase = parentImageStore } - st, err := system.Stat(filepath.Join(base, "diff")) + st, err := system.Stat(filepath.Join(parentBase, "diff")) if err != nil { return err }