summaryrefslogtreecommitdiff
path: root/pkg/libcontainer/nsinit/init.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/libcontainer/nsinit/init.go')
-rw-r--r--pkg/libcontainer/nsinit/init.go40
1 files changed, 29 insertions, 11 deletions
diff --git a/pkg/libcontainer/nsinit/init.go b/pkg/libcontainer/nsinit/init.go
index 336fc1eaaf..b6c02eafd5 100644
--- a/pkg/libcontainer/nsinit/init.go
+++ b/pkg/libcontainer/nsinit/init.go
@@ -4,6 +4,11 @@ package nsinit
import (
"fmt"
+ "os"
+ "runtime"
+ "syscall"
+
+ "github.com/dotcloud/docker/pkg/label"
"github.com/dotcloud/docker/pkg/libcontainer"
"github.com/dotcloud/docker/pkg/libcontainer/apparmor"
"github.com/dotcloud/docker/pkg/libcontainer/capabilities"
@@ -11,8 +16,6 @@ import (
"github.com/dotcloud/docker/pkg/libcontainer/utils"
"github.com/dotcloud/docker/pkg/system"
"github.com/dotcloud/docker/pkg/user"
- "os"
- "syscall"
)
// Init is the init process that first runs inside a new namespace to setup mounts, users, networking,
@@ -24,14 +27,17 @@ func (ns *linuxNs) Init(container *libcontainer.Container, uncleanRootfs, consol
}
// We always read this as it is a way to sync with the parent as well
+ ns.logger.Printf("reading from sync pipe fd %d\n", syncPipe.child.Fd())
context, err := syncPipe.ReadFromParent()
if err != nil {
syncPipe.Close()
return err
}
+ ns.logger.Println("received context from parent")
syncPipe.Close()
if console != "" {
+ ns.logger.Printf("setting up %s as console\n", console)
slave, err := system.OpenTerminal(console, syscall.O_RDWR)
if err != nil {
return fmt.Errorf("open terminal %s", err)
@@ -48,15 +54,15 @@ func (ns *linuxNs) Init(container *libcontainer.Container, uncleanRootfs, consol
return fmt.Errorf("setctty %s", err)
}
}
- if err := system.ParentDeathSignal(); err != nil {
- return fmt.Errorf("parent death signal %s", err)
- }
- if err := setupNewMountNamespace(rootfs, console, container.ReadonlyFs, container.NoPivotRoot); err != nil {
- return fmt.Errorf("setup mount namespace %s", err)
- }
if err := setupNetwork(container, context); err != nil {
return fmt.Errorf("setup networking %s", err)
}
+
+ label.Init()
+ ns.logger.Println("setup mount namespace")
+ if err := setupNewMountNamespace(rootfs, container.Mounts, console, container.ReadonlyFs, container.NoPivotRoot, container.Context["mount_label"]); err != nil {
+ return fmt.Errorf("setup mount namespace %s", err)
+ }
if err := system.Sethostname(container.Hostname); err != nil {
return fmt.Errorf("sethostname %s", err)
}
@@ -64,9 +70,17 @@ func (ns *linuxNs) Init(container *libcontainer.Container, uncleanRootfs, consol
return fmt.Errorf("finalize namespace %s", err)
}
- if err := apparmor.ApplyProfile(os.Getpid(), container.Context["apparmor_profile"]); err != nil {
- return err
+ if profile := container.Context["apparmor_profile"]; profile != "" {
+ ns.logger.Printf("setting apparmor profile %s\n", profile)
+ if err := apparmor.ApplyProfile(os.Getpid(), profile); err != nil {
+ return err
+ }
+ }
+ runtime.LockOSThread()
+ if err := label.SetProcessLabel(container.Context["process_label"]); err != nil {
+ return fmt.Errorf("SetProcessLabel label %s", err)
}
+ ns.logger.Printf("execing %s\n", args[0])
return system.Execv(args[0], args[0:], container.Env)
}
@@ -124,7 +138,11 @@ func setupNetwork(container *libcontainer.Container, context libcontainer.Contex
if err != nil {
return err
}
- return strategy.Initialize(config, context)
+
+ err1 := strategy.Initialize(config, context)
+ if err1 != nil {
+ return err1
+ }
}
return nil
}