commit
4a72e540fe
|
@ -10,7 +10,9 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/docker/docker/pkg/mount"
|
||||||
"github.com/docker/libcontainer/cgroups"
|
"github.com/docker/libcontainer/cgroups"
|
||||||
"github.com/docker/libcontainer/cgroups/fs"
|
"github.com/docker/libcontainer/cgroups/fs"
|
||||||
"github.com/docker/libcontainer/cgroups/systemd"
|
"github.com/docker/libcontainer/cgroups/systemd"
|
||||||
|
@ -78,6 +80,20 @@ func Cgroupfs(l *LinuxFactory) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TmpfsRoot is an option func to mount LinuxFactory.Root to tmpfs.
|
||||||
|
func TmpfsRoot(l *LinuxFactory) error {
|
||||||
|
mounted, err := mount.Mounted(l.Root)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !mounted {
|
||||||
|
if err := syscall.Mount("tmpfs", l.Root, "tmpfs", 0, ""); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// New returns a linux based container factory based in the root directory and
|
// New returns a linux based container factory based in the root directory and
|
||||||
// configures the factory with the provided option funcs.
|
// configures the factory with the provided option funcs.
|
||||||
func New(root string, options ...func(*LinuxFactory) error) (Factory, error) {
|
func New(root string, options ...func(*LinuxFactory) error) (Factory, error) {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/docker/docker/pkg/mount"
|
||||||
"github.com/docker/libcontainer/configs"
|
"github.com/docker/libcontainer/configs"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,9 +18,6 @@ func newTestRoot() (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
if err := os.MkdirAll(dir, 0700); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return dir, nil
|
return dir, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +47,58 @@ func TestFactoryNew(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFactoryNewTmpfs(t *testing.T) {
|
||||||
|
root, rerr := newTestRoot()
|
||||||
|
if rerr != nil {
|
||||||
|
t.Fatal(rerr)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(root)
|
||||||
|
factory, err := New(root, Cgroupfs, TmpfsRoot)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if factory == nil {
|
||||||
|
t.Fatal("factory should not be nil")
|
||||||
|
}
|
||||||
|
lfactory, ok := factory.(*LinuxFactory)
|
||||||
|
if !ok {
|
||||||
|
t.Fatal("expected linux factory returned on linux based systems")
|
||||||
|
}
|
||||||
|
if lfactory.Root != root {
|
||||||
|
t.Fatalf("expected factory root to be %q but received %q", root, lfactory.Root)
|
||||||
|
}
|
||||||
|
|
||||||
|
if factory.Type() != "libcontainer" {
|
||||||
|
t.Fatalf("unexpected factory type: %q, expected %q", factory.Type(), "libcontainer")
|
||||||
|
}
|
||||||
|
mounted, err := mount.Mounted(lfactory.Root)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if !mounted {
|
||||||
|
t.Fatalf("Factory Root is not mounted")
|
||||||
|
}
|
||||||
|
mounts, err := mount.GetMounts()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
var found bool
|
||||||
|
for _, m := range mounts {
|
||||||
|
if m.Mountpoint == lfactory.Root {
|
||||||
|
if m.Fstype != "tmpfs" {
|
||||||
|
t.Fatalf("Fstype of root: %s, expected %s", m.Fstype, "tmpfs")
|
||||||
|
}
|
||||||
|
if m.Source != "tmpfs" {
|
||||||
|
t.Fatalf("Source of root: %s, expected %s", m.Source, "tmpfs")
|
||||||
|
}
|
||||||
|
found = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
t.Fatalf("Factory Root is not listed in mounts list")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestFactoryLoadNotExists(t *testing.T) {
|
func TestFactoryLoadNotExists(t *testing.T) {
|
||||||
root, rerr := newTestRoot()
|
root, rerr := newTestRoot()
|
||||||
if rerr != nil {
|
if rerr != nil {
|
||||||
|
|
|
@ -24,7 +24,7 @@ func setupRootfs(config *configs.Config, console *linuxConsole) (err error) {
|
||||||
return newSystemError(err)
|
return newSystemError(err)
|
||||||
}
|
}
|
||||||
for _, m := range config.Mounts {
|
for _, m := range config.Mounts {
|
||||||
if err := mount(m, config.Rootfs, config.MountLabel); err != nil {
|
if err := mountToRootfs(m, config.Rootfs, config.MountLabel); err != nil {
|
||||||
return newSystemError(err)
|
return newSystemError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ func setupRootfs(config *configs.Config, console *linuxConsole) (err error) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mount(m *configs.Mount, rootfs, mountLabel string) error {
|
func mountToRootfs(m *configs.Mount, rootfs, mountLabel string) error {
|
||||||
var (
|
var (
|
||||||
dest = m.Destination
|
dest = m.Destination
|
||||||
data = label.FormatMountLabel(m.Data, mountLabel)
|
data = label.FormatMountLabel(m.Data, mountLabel)
|
||||||
|
|
Loading…
Reference in New Issue