diff options
author | Valentin Rothberg <rothberg@redhat.com> | 2021-09-30 16:42:45 +0200 |
---|---|---|
committer | Valentin Rothberg <rothberg@redhat.com> | 2021-10-01 13:30:46 +0200 |
commit | 686b7ef7bf5b60c50b45307d548518c9709da87e (patch) | |
tree | a0c9249e9bc97393aaead117afd9d51302fc91b6 /pkg/specgen/generate/container.go | |
parent | 1da364783dace3480ba1a142326aff2a644f19a8 (diff) | |
download | podman-686b7ef7bf5b60c50b45307d548518c9709da87e.tar.gz podman-686b7ef7bf5b60c50b45307d548518c9709da87e.tar.bz2 podman-686b7ef7bf5b60c50b45307d548518c9709da87e.zip |
pkg/specgen: cache image in generator
To prevent expensive redundant lookups and inspects on the same image,
cache the image in the generator. Note that once a given image has been
inspected, subsequent calls will use the libimage-internal cache.
[NO TESTS NEEDED] since it is no functional change.
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
Diffstat (limited to 'pkg/specgen/generate/container.go')
-rw-r--r-- | pkg/specgen/generate/container.go | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/pkg/specgen/generate/container.go b/pkg/specgen/generate/container.go index 71b882510..f4b2eeb25 100644 --- a/pkg/specgen/generate/container.go +++ b/pkg/specgen/generate/container.go @@ -18,19 +18,43 @@ import ( "golang.org/x/sys/unix" ) +func getImageFromSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerator) (*libimage.Image, string, *libimage.ImageData, error) { + if s.Image == "" || s.Rootfs != "" { + return nil, "", nil, nil + } + + // Image may already have been set in the generator. + image, resolvedName := s.GetImage() + if image != nil { + inspectData, err := image.Inspect(ctx, false) + if err != nil { + return nil, "", nil, err + } + return image, resolvedName, inspectData, nil + } + + // Need to look up image. + image, resolvedName, err := r.LibimageRuntime().LookupImage(s.Image, nil) + if err != nil { + return nil, "", nil, err + } + s.SetImage(image, resolvedName) + inspectData, err := image.Inspect(ctx, false) + if err != nil { + return nil, "", nil, err + } + return image, resolvedName, inspectData, err +} + // Fill any missing parts of the spec generator (e.g. from the image). // Returns a set of warnings or any fatal error that occurred. func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerator) ([]string, error) { // Only add image configuration if we have an image - var newImage *libimage.Image - var inspectData *libimage.ImageData - var err error - if s.Image != "" { - newImage, _, err = r.LibimageRuntime().LookupImage(s.Image, nil) - if err != nil { - return nil, err - } - + newImage, _, inspectData, err := getImageFromSpec(ctx, r, s) + if err != nil { + return nil, err + } + if inspectData != nil { inspectData, err = newImage.Inspect(ctx, false) if err != nil { return nil, err |