github.com/hinshun/containerd@v0.2.7/supervisor/create.go (about)

     1  package supervisor
     2  
     3  import (
     4  	"path/filepath"
     5  	"time"
     6  
     7  	"github.com/docker/containerd/runtime"
     8  	"golang.org/x/net/context"
     9  )
    10  
    11  // StartTask holds needed parameters to create a new container
    12  type StartTask struct {
    13  	baseTask
    14  	ID            string
    15  	BundlePath    string
    16  	Stdout        string
    17  	Stderr        string
    18  	Stdin         string
    19  	StartResponse chan StartResponse
    20  	Labels        []string
    21  	NoPivotRoot   bool
    22  	Checkpoint    *runtime.Checkpoint
    23  	CheckpointDir string
    24  	Runtime       string
    25  	RuntimeArgs   []string
    26  	Ctx           context.Context
    27  }
    28  
    29  func (s *Supervisor) start(t *StartTask) error {
    30  	start := time.Now()
    31  	rt := s.runtime
    32  	rtArgs := s.runtimeArgs
    33  	if t.Runtime != "" {
    34  		rt = t.Runtime
    35  		rtArgs = t.RuntimeArgs
    36  	}
    37  	container, err := runtime.New(runtime.ContainerOpts{
    38  		Root:        s.stateDir,
    39  		ID:          t.ID,
    40  		Bundle:      t.BundlePath,
    41  		Runtime:     rt,
    42  		RuntimeArgs: rtArgs,
    43  		Shim:        s.shim,
    44  		Labels:      t.Labels,
    45  		NoPivotRoot: t.NoPivotRoot,
    46  		Timeout:     s.timeout,
    47  	})
    48  	if err != nil {
    49  		return err
    50  	}
    51  	s.containers[t.ID] = &containerInfo{
    52  		container: container,
    53  	}
    54  	ContainersCounter.Inc(1)
    55  	task := &startTask{
    56  		Err:           t.ErrorCh(),
    57  		Container:     container,
    58  		StartResponse: t.StartResponse,
    59  		Stdin:         t.Stdin,
    60  		Stdout:        t.Stdout,
    61  		Stderr:        t.Stderr,
    62  		Ctx:           t.Ctx,
    63  	}
    64  	if t.Checkpoint != nil {
    65  		task.CheckpointPath = filepath.Join(t.CheckpointDir, t.Checkpoint.Name)
    66  	}
    67  
    68  	s.startTasks <- task
    69  	ContainerCreateTimer.UpdateSince(start)
    70  	return errDeferredResponse
    71  }