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 }