github.com/kata-containers/runtime@v0.0.0-20210505125100-04f29832a923/cli/start.go (about)

     1  // Copyright (c) 2014,2015,2016 Docker, Inc.
     2  // Copyright (c) 2017 Intel Corporation
     3  //
     4  // SPDX-License-Identifier: Apache-2.0
     5  //
     6  
     7  package main
     8  
     9  import (
    10  	"context"
    11  	"fmt"
    12  
    13  	"github.com/kata-containers/runtime/pkg/katautils"
    14  	vc "github.com/kata-containers/runtime/virtcontainers"
    15  	vcAnnot "github.com/kata-containers/runtime/virtcontainers/pkg/annotations"
    16  	"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
    17  	"github.com/sirupsen/logrus"
    18  	"github.com/urfave/cli"
    19  )
    20  
    21  var startCLICommand = cli.Command{
    22  	Name:  "start",
    23  	Usage: "executes the user defined process in a created container",
    24  	ArgsUsage: `<container-id> [container-id...]
    25  
    26     <container-id> is your name for the instance of the container that you
    27     are starting. The name you provide for the container instance must be
    28     unique on your host.`,
    29  	Description: `The start command executes the user defined process in a created container .`,
    30  	Action: func(context *cli.Context) error {
    31  		ctx, err := cliContextToContext(context)
    32  		if err != nil {
    33  			return err
    34  		}
    35  
    36  		args := context.Args()
    37  		if !args.Present() {
    38  			return fmt.Errorf("Missing container ID, should at least provide one")
    39  		}
    40  
    41  		for _, cID := range []string(args) {
    42  			if _, err := start(ctx, cID); err != nil {
    43  				return err
    44  			}
    45  		}
    46  
    47  		return nil
    48  	},
    49  }
    50  
    51  func start(ctx context.Context, containerID string) (vc.VCSandbox, error) {
    52  	span, _ := katautils.Trace(ctx, "start")
    53  	defer span.Finish()
    54  
    55  	kataLog = kataLog.WithField("container", containerID)
    56  	setExternalLoggers(ctx, kataLog)
    57  	span.SetTag("container", containerID)
    58  
    59  	// Checks the MUST and MUST NOT from OCI runtime specification
    60  	status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
    61  	if err != nil {
    62  		return nil, err
    63  	}
    64  
    65  	containerID = status.ID
    66  
    67  	kataLog = kataLog.WithFields(logrus.Fields{
    68  		"container": containerID,
    69  		"sandbox":   sandboxID,
    70  	})
    71  
    72  	setExternalLoggers(ctx, kataLog)
    73  	span.SetTag("container", containerID)
    74  	span.SetTag("sandbox", sandboxID)
    75  
    76  	containerType, err := oci.GetContainerType(status.Annotations)
    77  	if err != nil {
    78  		return nil, err
    79  	}
    80  
    81  	ociSpec, err := oci.GetOCIConfig(status)
    82  	if err != nil {
    83  		return nil, err
    84  	}
    85  
    86  	var sandbox vc.VCSandbox
    87  
    88  	if containerType.IsSandbox() {
    89  		s, err := vci.StartSandbox(ctx, sandboxID)
    90  		if err != nil {
    91  			return nil, err
    92  		}
    93  
    94  		sandbox = s
    95  	} else {
    96  		c, err := vci.StartContainer(ctx, sandboxID, containerID)
    97  		if err != nil {
    98  			return nil, err
    99  		}
   100  
   101  		sandbox = c.Sandbox()
   102  	}
   103  
   104  	// Run post-start OCI hooks.
   105  	err = katautils.EnterNetNS(sandbox.GetNetNs(), func() error {
   106  		return katautils.PostStartHooks(ctx, ociSpec, sandboxID, status.Annotations[vcAnnot.BundlePathKey])
   107  	})
   108  	if err != nil {
   109  		return nil, err
   110  	}
   111  
   112  	return sandbox, nil
   113  }