github.com/YousefHaggyHeroku/pack@v1.5.5/internal/build/phase.go (about) 1 package build 2 3 import ( 4 "context" 5 "io" 6 7 "github.com/docker/docker/api/types" 8 dcontainer "github.com/docker/docker/api/types/container" 9 "github.com/docker/docker/client" 10 "github.com/pkg/errors" 11 12 "github.com/YousefHaggyHeroku/pack/internal/container" 13 ) 14 15 type Phase struct { 16 name string 17 infoWriter io.Writer 18 errorWriter io.Writer 19 docker client.CommonAPIClient 20 ctrConf *dcontainer.Config 21 hostConf *dcontainer.HostConfig 22 ctr dcontainer.ContainerCreateCreatedBody 23 uid, gid int 24 appPath string 25 containerOps []ContainerOperation 26 fileFilter func(string) bool 27 } 28 29 func (p *Phase) Run(ctx context.Context) error { 30 var err error 31 p.ctr, err = p.docker.ContainerCreate(ctx, p.ctrConf, p.hostConf, nil, "") 32 if err != nil { 33 return errors.Wrapf(err, "failed to create '%s' container", p.name) 34 } 35 36 for _, containerOp := range p.containerOps { 37 if err := containerOp(p.docker, ctx, p.ctr.ID, p.infoWriter, p.errorWriter); err != nil { 38 return err 39 } 40 } 41 42 return container.Run( 43 ctx, 44 p.docker, 45 p.ctr.ID, 46 p.infoWriter, 47 p.errorWriter, 48 ) 49 } 50 51 func (p *Phase) Cleanup() error { 52 return p.docker.ContainerRemove(context.Background(), p.ctr.ID, types.ContainerRemoveOptions{Force: true}) 53 }