diff --git a/runsc/boot/controller.go b/runsc/boot/controller.go index 7d7803e92..bc33e028a 100644 --- a/runsc/boot/controller.go +++ b/runsc/boot/controller.go @@ -171,7 +171,6 @@ func (cm *containerManager) StartRoot(cid *string, _ *struct{}) error { if err := <-cm.startResultChan; err != nil { return fmt.Errorf("failed to start sandbox: %v", err) } - cm.l.setRootContainerID(*cid) return nil } diff --git a/runsc/boot/loader.go b/runsc/boot/loader.go index 5867eec96..9a5d649ab 100644 --- a/runsc/boot/loader.go +++ b/runsc/boot/loader.go @@ -142,7 +142,7 @@ func init() { // New initializes a new kernel loader configured by spec. // New also handles setting up a kernel for restoring a container. -func New(spec *specs.Spec, conf *Config, controllerFD, deviceFD int, goferFDs []int, console bool) (*Loader, error) { +func New(id string, spec *specs.Spec, conf *Config, controllerFD, deviceFD int, goferFDs []int, console bool) (*Loader, error) { if err := usage.Init(); err != nil { return nil, fmt.Errorf("Error setting up memory usage: %v", err) } @@ -286,6 +286,9 @@ func New(spec *specs.Spec, conf *Config, controllerFD, deviceFD int, goferFDs [] spec: spec, startSignalForwarding: startSignalForwarding, rootProcArgs: procArgs, + sandboxID: id, + containerRootTGs: make(map[string]*kernel.ThreadGroup), + execProcesses: make(map[execID]*kernel.ThreadGroup), } ctrl.manager.l = l return l, nil @@ -420,10 +423,9 @@ func (l *Loader) run() error { l.rootProcArgs.FDMap.DecRef() } - if l.execProcesses != nil { - return fmt.Errorf("there shouldn't already be a cache of exec'd processes, but found: %v", l.execProcesses) - } - l.execProcesses = make(map[execID]*kernel.ThreadGroup) + l.mu.Lock() + l.containerRootTGs[l.sandboxID] = l.k.GlobalInit() + l.mu.Unlock() // Start signal forwarding only after an init process is created. l.stopSignalForwarding = l.startSignalForwarding() diff --git a/runsc/boot/loader_test.go b/runsc/boot/loader_test.go index a8a796445..0b363253d 100644 --- a/runsc/boot/loader_test.go +++ b/runsc/boot/loader_test.go @@ -101,7 +101,7 @@ func createLoader() (*Loader, func(), error) { return nil, nil, err } - l, err := New(spec, conf, fd, -1 /* device fd */, []int{sandEnd}, false) + l, err := New("foo", spec, conf, fd, -1 /* device fd */, []int{sandEnd}, false) if err != nil { cleanup() return nil, nil, err @@ -129,7 +129,6 @@ func TestRun(t *testing.T) { }() // Run the container. - l.setRootContainerID("foo") if err := l.Run(); err != nil { t.Errorf("error running container: %v", err) } diff --git a/runsc/cmd/boot.go b/runsc/cmd/boot.go index 035147cf1..933ba2d9e 100644 --- a/runsc/cmd/boot.go +++ b/runsc/cmd/boot.go @@ -69,7 +69,7 @@ func (*Boot) Synopsis() string { // Usage implements subcommands.Command.Usage. func (*Boot) Usage() string { - return `boot [flags]` + return `boot [flags] ` } // SetFlags implements subcommands.Command.SetFlags. @@ -86,7 +86,7 @@ func (b *Boot) SetFlags(f *flag.FlagSet) { // Execute implements subcommands.Command.Execute. It starts a sandbox in a // waiting state. func (b *Boot) Execute(_ context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus { - if b.specFD == -1 || b.controllerFD == -1 || f.NArg() != 0 { + if b.specFD == -1 || b.controllerFD == -1 || f.NArg() != 1 { f.Usage() return subcommands.ExitUsageError } @@ -138,7 +138,7 @@ func (b *Boot) Execute(_ context.Context, f *flag.FlagSet, args ...interface{}) } // Create the loader. - l, err := boot.New(spec, conf, b.controllerFD, b.deviceFD, b.ioFDs.GetArray(), b.console) + l, err := boot.New(f.Arg(0), spec, conf, b.controllerFD, b.deviceFD, b.ioFDs.GetArray(), b.console) if err != nil { Fatalf("error creating loader: %v", err) } diff --git a/runsc/sandbox/sandbox.go b/runsc/sandbox/sandbox.go index 67244c725..c3d90d5f4 100644 --- a/runsc/sandbox/sandbox.go +++ b/runsc/sandbox/sandbox.go @@ -460,6 +460,9 @@ func (s *Sandbox) createSandboxProcess(spec *specs.Spec, conf *boot.Config, bund } } + // Add container as the last argument. + cmd.Args = append(cmd.Args, s.ID) + // Log the fds we are donating to the sandbox process. for i, f := range cmd.ExtraFiles { log.Debugf("Donating FD %d: %q", i+3, f.Name())