mirror of
https://github.com/containers/podman.git
synced 2025-09-11 17:15:06 +08:00
Merge pull request #10486 from vrothberg/tag-digest-support
support tag@digest notation
This commit is contained in:
@ -71,13 +71,12 @@ func CreateContainer(w http.ResponseWriter, r *http.Request) {
|
||||
imgNameOrID := newImage.ID()
|
||||
// if the img had multi names with the same sha256 ID, should use the InputName, not the ID
|
||||
if len(newImage.Names()) > 1 {
|
||||
imageRef, err := utils.ParseDockerReference(resolvedName)
|
||||
if err != nil {
|
||||
if err := utils.IsRegistryReference(resolvedName); err != nil {
|
||||
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest, err)
|
||||
return
|
||||
}
|
||||
// maybe the InputName has no tag, so use full name to display
|
||||
imgNameOrID = imageRef.DockerReference().String()
|
||||
imgNameOrID = resolvedName
|
||||
}
|
||||
|
||||
sg := specgen.NewSpecGenerator(imgNameOrID, cliOpts.RootFS)
|
||||
|
@ -482,7 +482,7 @@ func PushImage(w http.ResponseWriter, r *http.Request) {
|
||||
destination = source
|
||||
}
|
||||
|
||||
if _, err := utils.ParseDockerReference(destination); err != nil {
|
||||
if err := utils.IsRegistryReference(destination); err != nil {
|
||||
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest, err)
|
||||
return
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ func ImagesPull(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
// Make sure that the reference has no transport or the docker one.
|
||||
if _, err := utils.ParseDockerReference(query.Reference); err != nil {
|
||||
if err := utils.IsRegistryReference(query.Reference); err != nil {
|
||||
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest, err)
|
||||
return
|
||||
}
|
||||
|
@ -169,7 +169,7 @@ func ManifestPush(w http.ResponseWriter, r *http.Request) {
|
||||
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
|
||||
return
|
||||
}
|
||||
if _, err := utils.ParseDockerReference(query.Destination); err != nil {
|
||||
if err := utils.IsRegistryReference(query.Destination); err != nil {
|
||||
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest, err)
|
||||
return
|
||||
}
|
||||
|
@ -15,22 +15,19 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// ParseDockerReference parses the specified image name to a
|
||||
// `types.ImageReference` and enforces it to refer to a docker-transport
|
||||
// reference.
|
||||
func ParseDockerReference(name string) (types.ImageReference, error) {
|
||||
dockerPrefix := fmt.Sprintf("%s://", docker.Transport.Name())
|
||||
// IsRegistryReference checks if the specified name points to the "docker://"
|
||||
// transport. If it points to no supported transport, we'll assume a
|
||||
// non-transport reference pointing to an image (e.g., "fedora:latest").
|
||||
func IsRegistryReference(name string) error {
|
||||
imageRef, err := alltransports.ParseImageName(name)
|
||||
if err == nil && imageRef.Transport().Name() != docker.Transport.Name() {
|
||||
return nil, errors.Errorf("reference %q must be a docker reference", name)
|
||||
} else if err != nil {
|
||||
origErr := err
|
||||
imageRef, err = alltransports.ParseImageName(fmt.Sprintf("%s%s", dockerPrefix, name))
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(origErr, "reference %q must be a docker reference", name)
|
||||
}
|
||||
if err != nil {
|
||||
// No supported transport -> assume a docker-stype reference.
|
||||
return nil
|
||||
}
|
||||
return imageRef, nil
|
||||
if imageRef.Transport().Name() == docker.Transport.Name() {
|
||||
return nil
|
||||
}
|
||||
return errors.Errorf("unsupport transport %s in %q: only docker transport is supported", imageRef.Transport().Name(), name)
|
||||
}
|
||||
|
||||
// ParseStorageReference parses the specified image name to a
|
||||
|
Reference in New Issue
Block a user