2019-04-29 21:25:05 +00:00
// Copyright 2018 The gVisor Authors.
2018-04-27 17:37:02 +00:00
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cmd
import (
"context"
2018-11-28 22:00:54 +00:00
2018-04-27 17:37:02 +00:00
"flag"
"github.com/google/subcommands"
"gvisor.googlesource.com/gvisor/runsc/boot"
2018-05-15 17:17:19 +00:00
"gvisor.googlesource.com/gvisor/runsc/container"
2018-04-27 17:37:02 +00:00
"gvisor.googlesource.com/gvisor/runsc/specutils"
)
// Create implements subcommands.Command for the "create" command.
type Create struct {
// bundleDir is the path to the bundle directory (defaults to the
// current working directory).
bundleDir string
// pidFile is the filename that the sandbox pid will be written to.
2018-05-15 17:17:19 +00:00
// This file should only be created once the container process inside
// the sandbox is ready to use.
2018-04-27 17:37:02 +00:00
pidFile string
// consoleSocket is the path to an AF_UNIX socket which will receive a
// file descriptor referencing the master end of the console's
// pseudoterminal. This is ignored unless spec.Process.Terminal is
// true.
consoleSocket string
2018-10-11 18:55:45 +00:00
// userLog is the path to send user-visible logs to. This log is different
// from debug logs. The former is meant to be consumed by the users and should
// contain only information that is relevant to the person running the
// container, e.g. unsuported syscalls, while the later is more verbose and
// consumed by developers.
userLog string
2018-04-27 17:37:02 +00:00
}
// Name implements subcommands.Command.Name.
func ( * Create ) Name ( ) string {
return "create"
}
// Synopsis implements subcommands.Command.Synopsis.
func ( * Create ) Synopsis ( ) string {
return "create a secure container"
}
// Usage implements subcommands.Command.Usage.
func ( * Create ) Usage ( ) string {
return ` create [ flags ] < container id > - create a secure container
`
}
// SetFlags implements subcommands.Command.SetFlags.
func ( c * Create ) SetFlags ( f * flag . FlagSet ) {
f . StringVar ( & c . bundleDir , "bundle" , "" , "path to the root of the bundle directory, defaults to the current directory" )
f . StringVar ( & c . consoleSocket , "console-socket" , "" , "path to an AF_UNIX socket which will receive a file descriptor referencing the master end of the console's pseudoterminal" )
2018-05-15 17:17:19 +00:00
f . StringVar ( & c . pidFile , "pid-file" , "" , "filename that the container pid will be written to" )
2018-10-11 18:55:45 +00:00
f . StringVar ( & c . userLog , "user-log" , "" , "filename to send user-visible logs to. Empty means no logging." )
2018-04-27 17:37:02 +00:00
}
// Execute implements subcommands.Command.Execute.
func ( c * Create ) Execute ( _ context . Context , f * flag . FlagSet , args ... interface { } ) subcommands . ExitStatus {
if f . NArg ( ) != 1 {
f . Usage ( )
return subcommands . ExitUsageError
}
id := f . Arg ( 0 )
conf := args [ 0 ] . ( * boot . Config )
bundleDir := c . bundleDir
if bundleDir == "" {
bundleDir = getwdOrDie ( )
}
spec , err := specutils . ReadSpec ( bundleDir )
if err != nil {
2019-01-19 01:35:09 +00:00
Fatalf ( "reading spec: %v" , err )
2018-04-27 17:37:02 +00:00
}
specutils . LogSpec ( spec )
2018-05-15 17:17:19 +00:00
// Create the container. A new sandbox will be created for the
// container unless the metadata specifies that it should be run in an
// existing container.
2018-10-11 18:55:45 +00:00
if _ , err := container . Create ( id , spec , conf , bundleDir , c . consoleSocket , c . pidFile , c . userLog ) ; err != nil {
2019-01-19 01:35:09 +00:00
Fatalf ( "creating container: %v" , err )
2018-04-27 17:37:02 +00:00
}
return subcommands . ExitSuccess
}