From 5bd6559b079a25334f9415678a454aa2ebcd1902 Mon Sep 17 00:00:00 2001 From: Karan Lyons Date: Fri, 5 Jul 2013 16:16:58 -0700 Subject: [PATCH 1/2] Mount /dev/shm as a tmpfs Fixes #1122. Upstream-commit: 075d30dbced0e00843153a6975daa1291e90b339 Component: engine --- components/engine/lxc_template.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/engine/lxc_template.go b/components/engine/lxc_template.go index d49d66b4d9..617e3d5e2d 100644 --- a/components/engine/lxc_template.go +++ b/components/engine/lxc_template.go @@ -81,7 +81,7 @@ lxc.mount.entry = sysfs {{$ROOTFS}}/sys sysfs nosuid,nodev,noexec 0 0 lxc.mount.entry = devpts {{$ROOTFS}}/dev/pts devpts newinstance,ptmxmode=0666,nosuid,noexec 0 0 #lxc.mount.entry = varrun {{$ROOTFS}}/var/run tmpfs mode=755,size=4096k,nosuid,nodev,noexec 0 0 #lxc.mount.entry = varlock {{$ROOTFS}}/var/lock tmpfs size=1024k,nosuid,nodev,noexec 0 0 -#lxc.mount.entry = shm {{$ROOTFS}}/dev/shm tmpfs size=65536k,nosuid,nodev,noexec 0 0 +lxc.mount.entry = shm {{$ROOTFS}}/dev/shm tmpfs size=65536k,nosuid,nodev,noexec 0 0 # Inject docker-init lxc.mount.entry = {{.SysInitPath}} {{$ROOTFS}}/.dockerinit none bind,ro 0 0 From 02b34c43f350aa053b42ffe592fff37625344539 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Thu, 8 Aug 2013 11:25:02 -0700 Subject: [PATCH 2/2] Make sure all needed mountpoint are present Upstream-commit: 18fc707fdf06aeb50fa5250f59f0ef4597d7cf73 Component: engine --- components/engine/graph.go | 42 ++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/components/engine/graph.go b/components/engine/graph.go index 1d2a9f807f..606a6833ee 100644 --- a/components/engine/graph.go +++ b/components/engine/graph.go @@ -194,15 +194,41 @@ func (graph *Graph) getDockerInitLayer() (string, error) { // For all other errors, abort. return "", err } - // FIXME: how the hell do I break down this line in a way - // that is idiomatic and not ugly as hell? - if f, err := os.OpenFile(path.Join(initLayer, ".dockerinit"), os.O_CREATE|os.O_TRUNC, 0700); err != nil && !os.IsExist(err) { - // If file already existed, keep going. - // For all other errors, abort. - return "", err - } else { - f.Close() + + for pth, typ := range map[string]string{ + "/dev/pts": "dir", + "/dev/shm": "dir", + "/proc": "dir", + "/sys": "dir", + "/.dockerinit": "file", + "/etc/resolv.conf": "file", + // "var/run": "dir", + // "var/lock": "dir", + } { + if _, err := os.Stat(path.Join(initLayer, pth)); err != nil { + if os.IsNotExist(err) { + switch typ { + case "dir": + if err := os.MkdirAll(path.Join(initLayer, pth), 0755); err != nil { + return "", err + } + case "file": + if err := os.MkdirAll(path.Join(initLayer, path.Dir(pth)), 0755); err != nil { + return "", err + } + + if f, err := os.OpenFile(path.Join(initLayer, pth), os.O_CREATE, 0755); err != nil { + return "", err + } else { + f.Close() + } + } + } else { + return "", err + } + } } + // Layer is ready to use, if it wasn't before. return initLayer, nil }