github.com/buildpack/pack@v0.5.0/rebase.go (about) 1 package pack 2 3 import ( 4 "context" 5 6 "github.com/buildpack/lifecycle" 7 "github.com/buildpack/lifecycle/metadata" 8 "github.com/pkg/errors" 9 10 "github.com/buildpack/pack/builder" 11 "github.com/buildpack/pack/style" 12 ) 13 14 type RebaseOptions struct { 15 RepoName string 16 Publish bool 17 SkipPull bool 18 RunImage string 19 AdditionalMirrors map[string][]string 20 } 21 22 func (c *Client) Rebase(ctx context.Context, opts RebaseOptions) error { 23 imageRef, err := c.parseTagReference(opts.RepoName) 24 if err != nil { 25 return errors.Wrapf(err, "invalid image name '%s'", opts.RepoName) 26 } 27 28 appImage, err := c.imageFetcher.Fetch(ctx, opts.RepoName, !opts.Publish, !opts.SkipPull) 29 if err != nil { 30 return err 31 } 32 33 md, err := metadata.GetLayersMetadata(appImage) 34 if err != nil { 35 return err 36 } 37 38 runImageName := c.resolveRunImage( 39 opts.RunImage, 40 imageRef.Context().RegistryStr(), 41 builder.StackMetadata{ 42 RunImage: builder.RunImageMetadata{ 43 Image: md.Stack.RunImage.Image, 44 Mirrors: md.Stack.RunImage.Mirrors, 45 }, 46 }, 47 opts.AdditionalMirrors) 48 49 if runImageName == "" { 50 return errors.New("run image must be specified") 51 } 52 53 baseImage, err := c.imageFetcher.Fetch(ctx, runImageName, !opts.Publish, !opts.SkipPull) 54 if err != nil { 55 return err 56 } 57 58 c.logger.Infof("Rebasing %s on run image %s", style.Symbol(appImage.Name()), style.Symbol(baseImage.Name())) 59 rebaser := &lifecycle.Rebaser{Logger: c.logger} 60 err = rebaser.Rebase(appImage, baseImage, nil) 61 if err != nil { 62 return err 63 } 64 65 appImageIdentifier, err := appImage.Identifier() 66 if err != nil { 67 return err 68 } 69 70 c.logger.Infof("Rebased Image: %s", style.Symbol(appImageIdentifier.String())) 71 return nil 72 }