Apply PR feedback

* Rootfs dir is created during container creation not during bundle
  creation
* Add support for v2
* UnmountAll is a no-op when the path to unmount (i.e. the rootfs dir)
  does not exist or is invalid

Co-authored-by: Danail Branekov <danailster@gmail.com>
Signed-off-by: Georgi Sabev <georgethebeatle@gmail.com>
This commit is contained in:
Georgi Sabev 2019-04-04 18:40:30 +03:00
parent 2a5e4c4be7
commit c0f0b21314
6 changed files with 29 additions and 23 deletions

View File

@ -112,6 +112,9 @@ func unmount(target string, flags int) error {
// are no mounts remaining (EINVAL is returned by mount), which is // are no mounts remaining (EINVAL is returned by mount), which is
// useful for undoing a stack of mounts on the same mount point. // useful for undoing a stack of mounts on the same mount point.
func UnmountAll(mount string, flags int) error { func UnmountAll(mount string, flags int) error {
if _, err := os.Stat(mount); err != nil {
return nil
}
for { for {
if err := unmount(mount, flags); err != nil { if err := unmount(mount, flags); err != nil {
// EINVAL is returned if the target is not a // EINVAL is returned if the target is not a

View File

@ -65,9 +65,6 @@ func newBundle(id, path, workDir string, spec []byte) (b *bundle, err error) {
os.RemoveAll(workDir) os.RemoveAll(workDir)
} }
}() }()
if err := os.Mkdir(filepath.Join(path, "rootfs"), 0711); err != nil {
return nil, err
}
err = ioutil.WriteFile(filepath.Join(path, configFilename), spec, 0666) err = ioutil.WriteFile(filepath.Join(path, configFilename), spec, 0666)
return &bundle{ return &bundle{
id: id, id: id,

View File

@ -304,12 +304,10 @@ func (p *Init) delete(ctx context.Context) error {
} }
p.io.Close() p.io.Close()
} }
if p.Rootfs != "" { if err2 := mount.UnmountAll(p.Rootfs, 0); err2 != nil {
if err2 := mount.UnmountAll(p.Rootfs, 0); err2 != nil { log.G(ctx).WithError(err2).Warn("failed to cleanup rootfs mount")
log.G(ctx).WithError(err2).Warn("failed to cleanup rootfs mount") if err == nil {
if err == nil { err = errors.Wrap(err2, "failed rootfs umount")
err = errors.Wrap(err2, "failed rootfs umount")
}
} }
} }
return err return err

View File

@ -124,6 +124,14 @@ func (s *Service) Create(ctx context.Context, r *shimapi.CreateTaskRequest) (_ *
}) })
} }
rootfs := ""
if len(mounts) > 0 {
rootfs = filepath.Join(r.Bundle, "rootfs")
if err := os.Mkdir(rootfs, 0711); err != nil {
return nil, err
}
}
config := &proc.CreateConfig{ config := &proc.CreateConfig{
ID: r.ID, ID: r.ID,
Bundle: r.Bundle, Bundle: r.Bundle,
@ -137,14 +145,13 @@ func (s *Service) Create(ctx context.Context, r *shimapi.CreateTaskRequest) (_ *
ParentCheckpoint: r.ParentCheckpoint, ParentCheckpoint: r.ParentCheckpoint,
Options: r.Options, Options: r.Options,
} }
rootfs := filepath.Join(r.Bundle, "rootfs") defer func() {
defer func(rootfs string) {
if err != nil { if err != nil {
if err2 := mount.UnmountAll(rootfs, 0); err2 != nil { if err2 := mount.UnmountAll(rootfs, 0); err2 != nil {
log.G(ctx).WithError(err2).Warn("Failed to cleanup rootfs mount") log.G(ctx).WithError(err2).Warn("Failed to cleanup rootfs mount")
} }
} }
}(rootfs) }()
for _, rm := range mounts { for _, rm := range mounts {
m := &mount.Mount{ m := &mount.Mount{
Type: rm.Type, Type: rm.Type,
@ -159,10 +166,6 @@ func (s *Service) Create(ctx context.Context, r *shimapi.CreateTaskRequest) (_ *
s.mu.Lock() s.mu.Lock()
defer s.mu.Unlock() defer s.mu.Unlock()
if len(mounts) == 0 {
rootfs = ""
}
process, err := newInit( process, err := newInit(
ctx, ctx,
s.config.Path, s.config.Path,

View File

@ -89,10 +89,6 @@ func NewBundle(ctx context.Context, root, state, id string, spec []byte) (b *Bun
} }
} }
paths = append(paths, work) paths = append(paths, work)
// create rootfs dir
if err := os.Mkdir(filepath.Join(b.Path, "rootfs"), 0711); err != nil {
return nil, err
}
// symlink workdir // symlink workdir
if err := os.Symlink(work, filepath.Join(b.Path, "work")); err != nil { if err := os.Symlink(work, filepath.Join(b.Path, "work")); err != nil {
return nil, err return nil, err

View File

@ -21,6 +21,7 @@ package runc
import ( import (
"context" "context"
"io/ioutil" "io/ioutil"
"os"
"path/filepath" "path/filepath"
"sync" "sync"
@ -63,6 +64,15 @@ func NewContainer(ctx context.Context, platform rproc.Platform, r *task.CreateTa
Options: m.Options, Options: m.Options,
}) })
} }
rootfs := ""
if len(mounts) > 0 {
rootfs = filepath.Join(r.Bundle, "rootfs")
if err := os.Mkdir(rootfs, 0711); err != nil {
return nil, err
}
}
config := &proc.CreateConfig{ config := &proc.CreateConfig{
ID: r.ID, ID: r.ID,
Bundle: r.Bundle, Bundle: r.Bundle,
@ -80,7 +90,6 @@ func NewContainer(ctx context.Context, platform rproc.Platform, r *task.CreateTa
if err := WriteRuntime(r.Bundle, opts.BinaryName); err != nil { if err := WriteRuntime(r.Bundle, opts.BinaryName); err != nil {
return nil, err return nil, err
} }
rootfs := filepath.Join(r.Bundle, "rootfs")
defer func() { defer func() {
if err != nil { if err != nil {
if err2 := mount.UnmountAll(rootfs, 0); err2 != nil { if err2 := mount.UnmountAll(rootfs, 0); err2 != nil {
@ -107,6 +116,7 @@ func NewContainer(ctx context.Context, platform rproc.Platform, r *task.CreateTa
platform, platform,
config, config,
&opts, &opts,
rootfs,
) )
if err != nil { if err != nil {
return nil, errdefs.ToGRPC(err) return nil, errdefs.ToGRPC(err)
@ -146,8 +156,7 @@ func WriteRuntime(path, runtime string) error {
} }
func newInit(ctx context.Context, path, workDir, namespace string, platform rproc.Platform, func newInit(ctx context.Context, path, workDir, namespace string, platform rproc.Platform,
r *proc.CreateConfig, options *options.Options) (*proc.Init, error) { r *proc.CreateConfig, options *options.Options, rootfs string) (*proc.Init, error) {
rootfs := filepath.Join(path, "rootfs")
runtime := proc.NewRunc(options.Root, path, namespace, options.BinaryName, options.CriuPath, options.SystemdCgroup) runtime := proc.NewRunc(options.Root, path, namespace, options.BinaryName, options.CriuPath, options.SystemdCgroup)
p := proc.New(r.ID, runtime, rproc.Stdio{ p := proc.New(r.ID, runtime, rproc.Stdio{
Stdin: r.Stdin, Stdin: r.Stdin,