podman run/create: support all transports

Support all image transports in podman run/create.  It seems we
regressed with v2 on that.  Also add tests to make sure we're
not regressing again.

Fixes: #6744
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
Valentin Rothberg
2020-06-24 16:49:04 +02:00
parent 6bc5dcc282
commit f80461078e
3 changed files with 53 additions and 19 deletions

View File

@ -6,11 +6,12 @@ import (
"os" "os"
"strings" "strings"
"github.com/containers/libpod/libpod/define"
"github.com/containers/common/pkg/config" "github.com/containers/common/pkg/config"
"github.com/containers/image/v5/storage"
"github.com/containers/image/v5/transports/alltransports"
"github.com/containers/libpod/cmd/podman/common" "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry" "github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/domain/entities" "github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/errorhandling" "github.com/containers/libpod/pkg/errorhandling"
"github.com/containers/libpod/pkg/specgen" "github.com/containers/libpod/pkg/specgen"
@ -108,12 +109,15 @@ func create(cmd *cobra.Command, args []string) error {
return err return err
} }
imageName := args[0]
if !cliVals.RootFS { if !cliVals.RootFS {
if err := pullImage(args[0]); err != nil { name, err := pullImage(args[0])
if err != nil {
return err return err
} }
imageName = name
} }
s := specgen.NewSpecGenerator(args[0], cliVals.RootFS) s := specgen.NewSpecGenerator(imageName, cliVals.RootFS)
if err := common.FillOutSpecGen(s, &cliVals, args); err != nil { if err := common.FillOutSpecGen(s, &cliVals, args); err != nil {
return err return err
} }
@ -211,30 +215,44 @@ func createInit(c *cobra.Command) error {
return nil return nil
} }
func pullImage(imageName string) error { func pullImage(imageName string) (string, error) {
br, err := registry.ImageEngine().Exists(registry.GetContext(), imageName)
if err != nil {
return err
}
pullPolicy, err := config.ValidatePullPolicy(cliVals.Pull) pullPolicy, err := config.ValidatePullPolicy(cliVals.Pull)
if err != nil { if err != nil {
return err return "", err
} }
if !br.Value || pullPolicy == config.PullImageAlways {
if pullPolicy == config.PullImageNever { // Check if the image is missing and hence if we need to pull it.
return errors.Wrapf(define.ErrNoSuchImage, "unable to find a name and tag match for %s in repotags", imageName) imageMissing := true
imageRef, err := alltransports.ParseImageName(imageName)
switch {
case err != nil:
// Assume we specified a local image withouth the explicit storage transport.
fallthrough
case imageRef.Transport().Name() == storage.Transport.Name():
br, err := registry.ImageEngine().Exists(registry.GetContext(), imageName)
if err != nil {
return "", err
} }
_, pullErr := registry.ImageEngine().Pull(registry.GetContext(), imageName, entities.ImagePullOptions{ imageMissing = !br.Value
}
if imageMissing || pullPolicy == config.PullImageAlways {
if pullPolicy == config.PullImageNever {
return "", errors.Wrapf(define.ErrNoSuchImage, "unable to find a name and tag match for %s in repotags", imageName)
}
pullReport, pullErr := registry.ImageEngine().Pull(registry.GetContext(), imageName, entities.ImagePullOptions{
Authfile: cliVals.Authfile, Authfile: cliVals.Authfile,
Quiet: cliVals.Quiet, Quiet: cliVals.Quiet,
OverrideArch: cliVals.OverrideArch, OverrideArch: cliVals.OverrideArch,
OverrideOS: cliVals.OverrideOS, OverrideOS: cliVals.OverrideOS,
}) })
if pullErr != nil { if pullErr != nil {
return pullErr return "", pullErr
} }
imageName = pullReport.Images[0]
} }
return nil return imageName, nil
} }
func openCidFile(cidfile string) (*os.File, error) { func openCidFile(cidfile string) (*os.File, error) {

View File

@ -125,10 +125,13 @@ func run(cmd *cobra.Command, args []string) error {
return err return err
} }
imageName := args[0]
if !cliVals.RootFS { if !cliVals.RootFS {
if err := pullImage(args[0]); err != nil { name, err := pullImage(args[0])
if err != nil {
return err return err
} }
imageName = name
} }
if cliVals.Replace { if cliVals.Replace {
@ -166,7 +169,7 @@ func run(cmd *cobra.Command, args []string) error {
runOpts.Detach = cliVals.Detach runOpts.Detach = cliVals.Detach
runOpts.DetachKeys = cliVals.DetachKeys runOpts.DetachKeys = cliVals.DetachKeys
cliVals.PreserveFDs = runOpts.PreserveFDs cliVals.PreserveFDs = runOpts.PreserveFDs
s := specgen.NewSpecGenerator(args[0], cliVals.RootFS) s := specgen.NewSpecGenerator(imageName, cliVals.RootFS)
if err := common.FillOutSpecGen(s, &cliVals, args); err != nil { if err := common.FillOutSpecGen(s, &cliVals, args); err != nil {
return err return err
} }
@ -196,7 +199,7 @@ func run(cmd *cobra.Command, args []string) error {
return nil return nil
} }
if runRmi { if runRmi {
_, rmErrors := registry.ImageEngine().Remove(registry.GetContext(), []string{args[0]}, entities.ImageRemoveOptions{}) _, rmErrors := registry.ImageEngine().Remove(registry.GetContext(), []string{imageName}, entities.ImageRemoveOptions{})
if len(rmErrors) > 0 { if len(rmErrors) > 0 {
logrus.Errorf("%s", errors.Wrapf(errorhandling.JoinErrors(rmErrors), "failed removing image")) logrus.Errorf("%s", errors.Wrapf(errorhandling.JoinErrors(rmErrors), "failed removing image"))
} }

View File

@ -201,4 +201,17 @@ echo $rand | 0 | $rand
"podman will not overwrite existing cidfile" "podman will not overwrite existing cidfile"
} }
@test "podman run docker-archive" {
tmpdir=$PODMAN_TMPDIR/run-archive
mkdir -p $tmpdir
archive=$tmpdir/archive.tar
run_podman save $IMAGE -o $archive
run_podman run docker-archive:$archive ls
# Also make sure create eats the archive as well
run_podman create docker-archive:$archive ls
}
# vim: filetype=sh # vim: filetype=sh