mirror of
https://github.com/containers/podman
synced 2024-10-21 01:34:37 +00:00
Create|Run container from Image ID
As reported in Issue #50, we need to be able to run or create a container based on an image ID (as well as name). Signed-off-by: baude <bbaude@redhat.com> Closes: #76 Approved by: rhatdan
This commit is contained in:
parent
548f1516de
commit
61e0ab4f47
|
@ -171,6 +171,18 @@ func createCmd(c *cli.Context) error {
|
|||
return err
|
||||
}
|
||||
if createImage.LocalName != "" {
|
||||
nameIsID, err := runtime.IsImageID(createImage.LocalName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if nameIsID {
|
||||
// If the input from the user is an ID, then we need to get the image
|
||||
// name for cstorage
|
||||
createImage.LocalName, err = createImage.GetNameByID()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
imageName = createImage.LocalName
|
||||
} else {
|
||||
imageName, err = createImage.GetFQName()
|
||||
|
|
|
@ -54,6 +54,18 @@ func runCmd(c *cli.Context) error {
|
|||
logrus.Debug("spec is ", runtimeSpec)
|
||||
|
||||
if createImage.LocalName != "" {
|
||||
nameIsID, err := runtime.IsImageID(createImage.LocalName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if nameIsID {
|
||||
// If the input from the user is an ID, then we need to get the image
|
||||
// name for cstorage
|
||||
createImage.LocalName, err = createImage.GetNameByID()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
imageName = createImage.LocalName
|
||||
} else {
|
||||
imageName, err = createImage.GetFQName()
|
||||
|
|
|
@ -138,6 +138,36 @@ func (r *Runtime) NewImage(name string) Image {
|
|||
}
|
||||
}
|
||||
|
||||
// IsImageID determines if the input is a valid image ID.
|
||||
// The input can be a full or partial image ID
|
||||
func (r *Runtime) IsImageID(input string) (bool, error) {
|
||||
images, err := r.GetImages(&ImageFilterParams{})
|
||||
if err != nil {
|
||||
return false, errors.Wrapf(err, "unable to get images")
|
||||
}
|
||||
for _, image := range images {
|
||||
if strings.HasPrefix(image.ID, input) {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// GetNameByID returns the name of the image when supplied
|
||||
// the full or partion ID
|
||||
func (k *Image) GetNameByID() (string, error) {
|
||||
images, err := k.runtime.GetImages(&ImageFilterParams{})
|
||||
if err != nil {
|
||||
return "", errors.Wrapf(err, "unable to get images")
|
||||
}
|
||||
for _, image := range images {
|
||||
if strings.HasPrefix(image.ID, k.Name) {
|
||||
return image.Names[0], nil
|
||||
}
|
||||
}
|
||||
return "", errors.Errorf("unable to determine image for %s", k.Name)
|
||||
}
|
||||
|
||||
// GetImageID returns the image ID of the image
|
||||
func (k *Image) GetImageID() (string, error) {
|
||||
// If the ID field is already populated, then
|
||||
|
@ -309,6 +339,9 @@ func (k *Image) GetLocalImageName() (string, error) {
|
|||
return "", err
|
||||
}
|
||||
for _, image := range localImages {
|
||||
if strings.HasPrefix(image.ID, k.Name) {
|
||||
return image.ID, nil
|
||||
}
|
||||
for _, name := range image.Names {
|
||||
imgRef, err := reference.Parse(name)
|
||||
if err != nil {
|
||||
|
|
Loading…
Reference in a new issue