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  }