diff --git a/cmd/ctr/run_unix.go b/cmd/ctr/run_unix.go index d67f77943..a26eb73be 100644 --- a/cmd/ctr/run_unix.go +++ b/cmd/ctr/run_unix.go @@ -26,8 +26,8 @@ import ( ) const ( - rwm = "rwm" - rootfsPath = "rootfs" + rwm = "rwm" + defaultRootfsPath = "rootfs" ) var capabilities = []string{ @@ -47,7 +47,7 @@ var capabilities = []string{ "CAP_AUDIT_WRITE", } -func spec(id string, config *ocispec.ImageConfig, context *cli.Context) (*specs.Spec, error) { +func spec(id string, config *ocispec.ImageConfig, context *cli.Context, rootfs string) (*specs.Spec, error) { env := []string{ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", } @@ -92,6 +92,9 @@ func spec(id string, config *ocispec.ImageConfig, context *cli.Context) (*specs. if cwd == "" { cwd = "/" } + if rootfs == "" { + rootfs = defaultRootfsPath + } s := &specs.Spec{ Version: specs.Version, Platform: specs.Platform{ @@ -99,7 +102,7 @@ func spec(id string, config *ocispec.ImageConfig, context *cli.Context) (*specs. Arch: runtime.GOARCH, }, Root: specs.Root{ - Path: rootfsPath, + Path: rootfs, Readonly: context.Bool("readonly"), }, Process: specs.Process{ @@ -232,9 +235,9 @@ func customSpec(configPath string, rootfs string) (*specs.Spec, error) { return nil, err } if rootfs == "" { - if s.Root.Path != rootfsPath { - logrus.Warnf("ignoring Root.Path %q, setting %q forcibly", s.Root.Path, rootfsPath) - s.Root.Path = rootfsPath + if s.Root.Path != defaultRootfsPath { + logrus.Warnf("ignoring Root.Path %q, setting %q forcibly", s.Root.Path, defaultRootfsPath) + s.Root.Path = defaultRootfsPath } } else { s.Root.Path = rootfs @@ -245,7 +248,7 @@ func customSpec(configPath string, rootfs string) (*specs.Spec, error) { func getConfig(context *cli.Context, imageConfig *ocispec.ImageConfig, rootfs string) (*specs.Spec, error) { config := context.String("runtime-config") if config == "" { - return spec(context.String("id"), imageConfig, context) + return spec(context.String("id"), imageConfig, context, rootfs) } return customSpec(config, rootfs) diff --git a/linux/runtime.go b/linux/runtime.go index fdb11d37b..613d9a522 100644 --- a/linux/runtime.go +++ b/linux/runtime.go @@ -10,6 +10,7 @@ import ( "io/ioutil" "os" "path/filepath" + "strings" "time" "github.com/containerd/containerd" @@ -27,23 +28,29 @@ const ( runtimeName = "linux" configFilename = "config.json" defaultRuntime = "runc" + defaultShim = "containerd-shim" ) func init() { plugin.Register(runtimeName, &plugin.Registration{ - Type: plugin.RuntimePlugin, - Init: New, - Config: &Config{}, + Type: plugin.RuntimePlugin, + Init: New, + Config: &Config{ + Shim: defaultShim, + Runtime: defaultRuntime, + }, }) } var _ = (plugin.Runtime)(&Runtime{}) type Config struct { + // Shim is a path or name of binary implementing the Shim GRPC API + Shim string `toml:"shim,omitempty"` // Runtime is a path or name of an OCI runtime used by the shim - Runtime string `toml:"runtime"` + Runtime string `toml:"runtime,omitempty"` // NoShim calls runc directly from within the pkg - NoShim bool `toml:"no_shim"` + NoShim bool `toml:"no_shim,omitempty"` } func New(ic *plugin.InitContext) (interface{}, error) { @@ -52,13 +59,11 @@ func New(ic *plugin.InitContext) (interface{}, error) { return nil, err } cfg := ic.Config.(*Config) - if cfg.Runtime == "" { - cfg.Runtime = defaultRuntime - } c, cancel := context.WithCancel(ic.Context) r := &Runtime{ root: path, remote: !cfg.NoShim, + shim: cfg.Shim, runtime: cfg.Runtime, events: make(chan *containerd.Event, 2048), eventsContext: c, @@ -72,6 +77,7 @@ func New(ic *plugin.InitContext) (interface{}, error) { type Runtime struct { root string + shim string runtime string remote bool @@ -86,7 +92,7 @@ func (r *Runtime) Create(ctx context.Context, id string, opts plugin.CreateOpts) if err != nil { return nil, err } - s, err := newShim(path, r.remote) + s, err := newShim(r.shim, path, r.remote) if err != nil { os.RemoveAll(path) return nil, err @@ -187,7 +193,9 @@ func (r *Runtime) forward(events shim.Shim_EventsClient) { for { e, err := events.Recv() if err != nil { - log.G(r.eventsContext).WithError(err).Error("get event from shim") + if !strings.HasSuffix(err.Error(), "transport is closing") { + log.G(r.eventsContext).WithError(err).Error("get event from shim") + } return } var et containerd.EventType diff --git a/linux/shim.go b/linux/shim.go index f054b58e9..0edc6270b 100644 --- a/linux/shim.go +++ b/linux/shim.go @@ -22,7 +22,7 @@ import ( "github.com/pkg/errors" ) -func newShim(path string, remote bool) (shim.ShimClient, error) { +func newShim(shimName string, path string, remote bool) (shim.ShimClient, error) { if !remote { return localShim.Client(path) } @@ -31,7 +31,7 @@ func newShim(path string, remote bool) (shim.ShimClient, error) { if err != nil { return nil, err } - cmd := exec.Command("containerd-shim") + cmd := exec.Command(shimName) cmd.Dir = path f, err := l.(*net.UnixListener).File() if err != nil {