github.com/buildpack/pack@v0.5.0/inspect_image.go (about) 1 package pack 2 3 import ( 4 "context" 5 "encoding/json" 6 7 "github.com/Masterminds/semver" 8 "github.com/buildpack/lifecycle/metadata" 9 "github.com/pkg/errors" 10 11 "github.com/buildpack/pack/image" 12 ) 13 14 type ImageInfo struct { 15 StackID string 16 Buildpacks []metadata.BuildpackMetadata 17 Base metadata.RunImageMetadata 18 BOM interface{} 19 Stack metadata.StackMetadata 20 } 21 22 func (c *Client) InspectImage(name string, daemon bool) (*ImageInfo, error) { 23 img, err := c.imageFetcher.Fetch(context.Background(), name, daemon, false) 24 if err != nil { 25 if errors.Cause(err) == image.ErrNotFound { 26 return nil, nil 27 } 28 return nil, err 29 } 30 rawLayersMd, err := metadata.GetRawMetadata(img, metadata.LayerMetadataLabel) 31 if err != nil { 32 return nil, err 33 } 34 var layersMd metadata.LayersMetadata 35 if rawLayersMd != "" { 36 if err := json.Unmarshal([]byte(rawLayersMd), &layersMd); err != nil { 37 return nil, errors.Wrapf(err, "failed to parse label '%s'", metadata.LayerMetadataLabel) 38 } 39 } 40 41 rawBuildMd, _ := metadata.GetRawMetadata(img, metadata.BuildMetadataLabel) 42 if err != nil { 43 return nil, err 44 } 45 var buildMD metadata.BuildMetadata 46 if rawBuildMd != "" { 47 if err := json.Unmarshal([]byte(rawBuildMd), &buildMD); err != nil { 48 return nil, errors.Wrapf(err, "failed to parse label '%s'", metadata.BuildMetadataLabel) 49 } 50 } 51 52 minimumBaseImageReferenceVersion := semver.MustParse("0.5.0") 53 actualLauncherVersion, err := semver.NewVersion(buildMD.Launcher.Version) 54 55 if err == nil && actualLauncherVersion.LessThan(minimumBaseImageReferenceVersion) { 56 layersMd.RunImage.Reference = "" 57 } 58 59 stackID, err := metadata.GetRawMetadata(img, metadata.StackMetadataLabel) 60 if err != nil { 61 return nil, err 62 } 63 64 return &ImageInfo{ 65 StackID: stackID, 66 Stack: layersMd.Stack, 67 Base: layersMd.RunImage, 68 BOM: buildMD.BOM, 69 Buildpacks: buildMD.Buildpacks, 70 }, nil 71 }