github.com/jiasir/docker@v1.3.3-0.20170609024000-252e610103e7/api/server/backend/build/backend.go (about) 1 package build 2 3 import ( 4 "fmt" 5 6 "github.com/docker/distribution/reference" 7 "github.com/docker/docker/api/types/backend" 8 "github.com/docker/docker/builder" 9 "github.com/docker/docker/builder/dockerfile" 10 "github.com/docker/docker/image" 11 "github.com/docker/docker/pkg/stringid" 12 "github.com/pkg/errors" 13 "golang.org/x/net/context" 14 ) 15 16 // ImageComponent provides an interface for working with images 17 type ImageComponent interface { 18 SquashImage(from string, to string) (string, error) 19 TagImageWithReference(image.ID, reference.Named) error 20 } 21 22 // Backend provides build functionality to the API router 23 type Backend struct { 24 manager *dockerfile.BuildManager 25 imageComponent ImageComponent 26 } 27 28 // NewBackend creates a new build backend from components 29 func NewBackend(components ImageComponent, builderBackend builder.Backend) *Backend { 30 manager := dockerfile.NewBuildManager(builderBackend) 31 return &Backend{imageComponent: components, manager: manager} 32 } 33 34 // Build builds an image from a Source 35 func (b *Backend) Build(ctx context.Context, config backend.BuildConfig) (string, error) { 36 options := config.Options 37 tagger, err := NewTagger(b.imageComponent, config.ProgressWriter.StdoutFormatter, options.Tags) 38 if err != nil { 39 return "", err 40 } 41 42 build, err := b.manager.Build(ctx, config) 43 if err != nil { 44 return "", err 45 } 46 47 var imageID = build.ImageID 48 if options.Squash { 49 if imageID, err = squashBuild(build, b.imageComponent); err != nil { 50 return "", err 51 } 52 } 53 54 stdout := config.ProgressWriter.StdoutFormatter 55 fmt.Fprintf(stdout, "Successfully built %s\n", stringid.TruncateID(imageID)) 56 err = tagger.TagImages(image.ID(imageID)) 57 return imageID, err 58 } 59 60 func squashBuild(build *builder.Result, imageComponent ImageComponent) (string, error) { 61 var fromID string 62 if build.FromImage != nil { 63 fromID = build.FromImage.ImageID() 64 } 65 imageID, err := imageComponent.SquashImage(build.ImageID, fromID) 66 if err != nil { 67 return "", errors.Wrap(err, "error squashing image") 68 } 69 return imageID, nil 70 }