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 /pkg/specgen | |
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
Diffstat (limited to 'pkg/specgen')
-rw-r--r-- | pkg/specgen/generate/container.go | 39 |
1 files changed, 38 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 { |