diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-09-30 18:38:07 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-30 18:38:07 +0000 |
commit | 1d7cb7f477a4d9ea10d3ec08edac3327d7802c6c (patch) | |
tree | 0a34707d4667abead32385f13402b8c1a640775d | |
parent | f86e01ab10821d99cebb82d10c3bd5dad77af8c6 (diff) | |
parent | d24ec648873698bac14047e0af128099186e38d3 (diff) | |
download | podman-1d7cb7f477a4d9ea10d3ec08edac3327d7802c6c.tar.gz podman-1d7cb7f477a4d9ea10d3ec08edac3327d7802c6c.tar.bz2 podman-1d7cb7f477a4d9ea10d3ec08edac3327d7802c6c.zip |
Merge pull request #7798 from QiWang19/run-manifest
Use local image if input image is a manifest list
-rw-r--r-- | pkg/specgen/generate/container.go | 39 | ||||
-rw-r--r-- | test/e2e/create_test.go | 17 |
2 files changed, 55 insertions, 1 deletions
diff --git a/pkg/specgen/generate/container.go b/pkg/specgen/generate/container.go index 927e6b7fa..2ee8f2441 100644 --- a/pkg/specgen/generate/container.go +++ b/pkg/specgen/generate/container.go @@ -13,6 +13,7 @@ import ( "github.com/containers/podman/v2/pkg/specgen" spec "github.com/opencontainers/runtime-spec/specs-go" "github.com/pkg/errors" + "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) @@ -33,7 +34,43 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat _, mediaType, err := newImage.Manifest(ctx) if err != nil { - return nil, err + if errors.Cause(err) != image.ErrImageIsBareList { + return nil, err + } + // if err is not runnable image + // use the local store image with repo@digest matches with the list, if exists + manifestByte, manifestType, err := newImage.GetManifest(ctx, nil) + if err != nil { + return nil, err + } + list, err := manifest.ListFromBlob(manifestByte, manifestType) + if err != nil { + return nil, err + } + images, err := r.ImageRuntime().GetImages() + if err != nil { + return nil, err + } + findLocal := false + listDigest, err := list.ChooseInstance(r.SystemContext()) + if err != nil { + return nil, err + } + for _, img := range images { + for _, imageDigest := range img.Digests() { + if imageDigest == listDigest { + newImage = img + s.Image = img.ID() + mediaType = manifestType + findLocal = true + logrus.Debug("image contains manifest list, using image from local storage") + break + } + } + } + if !findLocal { + return nil, image.ErrImageIsBareList + } } if s.HealthConfig == nil && mediaType == manifest.DockerV2Schema2MediaType { diff --git a/test/e2e/create_test.go b/test/e2e/create_test.go index e6491ce9b..96a234446 100644 --- a/test/e2e/create_test.go +++ b/test/e2e/create_test.go @@ -609,4 +609,21 @@ var _ = Describe("Podman create", func() { Expect(session.ExitCode()).ToNot(BeZero()) }) + It("create use local store image if input image contains a manifest list", func() { + session := podmanTest.Podman([]string{"pull", BB}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(BeZero()) + + session = podmanTest.Podman([]string{"manifest", "create", "mylist"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"manifest", "add", "--all", "mylist", BB}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(BeZero()) + + session = podmanTest.Podman([]string{"create", "mylist"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(BeZero()) + }) }) |