github.imxd.top/openshift/source-to-image@v1.2.0/pkg/run/run.go (about)

     1  // Package run supports running images produced by S2I. It is used by the
     2  // --run=true command line option.
     3  package run
     4  
     5  import (
     6  	"io"
     7  
     8  	"github.com/openshift/source-to-image/pkg/api"
     9  	"github.com/openshift/source-to-image/pkg/docker"
    10  	s2ierr "github.com/openshift/source-to-image/pkg/errors"
    11  	utillog "github.com/openshift/source-to-image/pkg/util/log"
    12  )
    13  
    14  var (
    15  	log = utillog.StderrLog
    16  )
    17  
    18  // A DockerRunner allows running a Docker image as a new container, streaming
    19  // stdout and stderr with glog.
    20  type DockerRunner struct {
    21  	ContainerClient docker.Docker
    22  }
    23  
    24  // New creates a DockerRunner for executing the methods associated with running
    25  // the produced image in a docker container for verification purposes.
    26  func New(client docker.Client, config *api.Config) *DockerRunner {
    27  	d := docker.New(client, config.PullAuthentication)
    28  	return &DockerRunner{d}
    29  }
    30  
    31  // Run invokes the Docker API to run the image defined in config as a new
    32  // container. The container's stdout and stderr will be logged with glog.
    33  func (b *DockerRunner) Run(config *api.Config) error {
    34  	log.V(4).Infof("Attempting to run image %s \n", config.Tag)
    35  
    36  	outReader, outWriter := io.Pipe()
    37  	errReader, errWriter := io.Pipe()
    38  
    39  	opts := docker.RunContainerOptions{
    40  		Image:        config.Tag,
    41  		Stdout:       outWriter,
    42  		Stderr:       errWriter,
    43  		TargetImage:  true,
    44  		CGroupLimits: config.CGroupLimits,
    45  		CapDrop:      config.DropCapabilities,
    46  	}
    47  
    48  	docker.StreamContainerIO(errReader, nil, func(s string) { log.Error(s) })
    49  	docker.StreamContainerIO(outReader, nil, func(s string) { log.Info(s) })
    50  
    51  	err := b.ContainerClient.RunContainer(opts)
    52  	// If we get a ContainerError, the original message reports the
    53  	// container name. The container is temporary and its name is
    54  	// meaningless, therefore we make the error message more helpful by
    55  	// replacing the container name with the image tag.
    56  	if e, ok := err.(s2ierr.ContainerError); ok {
    57  		return s2ierr.NewContainerError(config.Tag, e.ErrorCode, e.Output)
    58  	}
    59  	return err
    60  }