summaryrefslogtreecommitdiff
path: root/pkg/api/handlers/utils
diff options
context:
space:
mode:
authorValentin Rothberg <vrothberg@redhat.com>2022-05-19 14:59:19 +0200
committerValentin Rothberg <vrothberg@redhat.com>2022-05-23 15:08:15 +0200
commitc984956f932be12951df4273e8b4a7b9737dce9c (patch)
treebe85f1fe49402aec0ddd762ffa46710472195321 /pkg/api/handlers/utils
parent769e777656e62172ccdd1b98989627d6dae57a96 (diff)
downloadpodman-c984956f932be12951df4273e8b4a7b9737dce9c.tar.gz
podman-c984956f932be12951df4273e8b4a7b9737dce9c.tar.bz2
podman-c984956f932be12951df4273e8b4a7b9737dce9c.zip
fix compat image resolution
Fix a bug in the resolution of images in the Docker compat API. When looking up an image by a short name, the name may match an image that does not live on Docker Hub. The resolved name should be used for normalization instead of the input name to make sure that `busybox` can resolve to `registry.com/busybox` if present in the local storage. Fixes: #14291 Signed-off-by: Valentin Rothberg <vrothberg@redhat.com>
Diffstat (limited to 'pkg/api/handlers/utils')
-rw-r--r--pkg/api/handlers/utils/images.go13
1 files changed, 9 insertions, 4 deletions
diff --git a/pkg/api/handlers/utils/images.go b/pkg/api/handlers/utils/images.go
index 7154f5616..433231f59 100644
--- a/pkg/api/handlers/utils/images.go
+++ b/pkg/api/handlers/utils/images.go
@@ -26,21 +26,26 @@ func NormalizeToDockerHub(r *http.Request, nameOrID string) (string, error) {
return nameOrID, nil
}
- // Try to lookup the input to figure out if it was an ID or not.
runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime)
- img, _, err := runtime.LibimageRuntime().LookupImage(nameOrID, nil)
+
+ // The candidate may resolve to a local non-Docker Hub image, such as
+ // 'busybox' -> 'registry.com/busybox'.
+ img, candidate, err := runtime.LibimageRuntime().LookupImage(nameOrID, nil)
if err != nil {
if errors.Cause(err) != storage.ErrImageUnknown {
return "", fmt.Errorf("normalizing name for compat API: %v", err)
}
+ // If the image could not be resolved locally, set the
+ // candidate back to the input.
+ candidate = nameOrID
} else if strings.HasPrefix(img.ID(), strings.TrimPrefix(nameOrID, "sha256:")) {
return img.ID(), nil
}
// No ID, so we can normalize.
- named, err := reference.ParseNormalizedNamed(nameOrID)
+ named, err := reference.ParseNormalizedNamed(candidate)
if err != nil {
- return "", fmt.Errorf("normalizing name for compat API: %v", err)
+ return "", fmt.Errorf("normalizing name %q (orig: %q) for compat API: %v", candidate, nameOrID, err)
}
return named.String(), nil