|
@@ -10,6 +10,7 @@ import (
|
|
"os"
|
|
"os"
|
|
"os/exec"
|
|
"os/exec"
|
|
"path"
|
|
"path"
|
|
|
|
+ "strconv"
|
|
"strings"
|
|
"strings"
|
|
"syscall"
|
|
"syscall"
|
|
|
|
|
|
@@ -21,6 +22,7 @@ import (
|
|
"github.com/docker/docker/pkg/directory"
|
|
"github.com/docker/docker/pkg/directory"
|
|
"github.com/docker/docker/pkg/idtools"
|
|
"github.com/docker/docker/pkg/idtools"
|
|
"github.com/docker/docker/pkg/mount"
|
|
"github.com/docker/docker/pkg/mount"
|
|
|
|
+ "github.com/docker/docker/pkg/parsers"
|
|
"github.com/docker/docker/pkg/parsers/kernel"
|
|
"github.com/docker/docker/pkg/parsers/kernel"
|
|
|
|
|
|
"github.com/opencontainers/runc/libcontainer/label"
|
|
"github.com/opencontainers/runc/libcontainer/label"
|
|
@@ -92,6 +94,10 @@ func init() {
|
|
// If overlay filesystem is not supported on the host, graphdriver.ErrNotSupported is returned as error.
|
|
// If overlay filesystem is not supported on the host, graphdriver.ErrNotSupported is returned as error.
|
|
// If a overlay filesystem is not supported over a existing filesystem then error graphdriver.ErrIncompatibleFS is returned.
|
|
// If a overlay filesystem is not supported over a existing filesystem then error graphdriver.ErrIncompatibleFS is returned.
|
|
func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) {
|
|
func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) {
|
|
|
|
+ opts, err := parseOptions(options)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
|
|
if err := supportsOverlay(); err != nil {
|
|
if err := supportsOverlay(); err != nil {
|
|
return nil, graphdriver.ErrNotSupported
|
|
return nil, graphdriver.ErrNotSupported
|
|
@@ -103,7 +109,10 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
if kernel.CompareKernelVersion(*v, kernel.VersionInfo{Kernel: 4, Major: 0, Minor: 0}) < 0 {
|
|
if kernel.CompareKernelVersion(*v, kernel.VersionInfo{Kernel: 4, Major: 0, Minor: 0}) < 0 {
|
|
- return nil, graphdriver.ErrNotSupported
|
|
|
|
|
|
+ if !opts.overrideKernelCheck {
|
|
|
|
+ return nil, graphdriver.ErrNotSupported
|
|
|
|
+ }
|
|
|
|
+ logrus.Warnf("Using pre-4.0.0 kernel for overlay2, mount failures may require kernel update")
|
|
}
|
|
}
|
|
|
|
|
|
fsMagic, err := graphdriver.GetFSMagic(home)
|
|
fsMagic, err := graphdriver.GetFSMagic(home)
|
|
@@ -144,6 +153,31 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
|
|
return d, nil
|
|
return d, nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+type overlayOptions struct {
|
|
|
|
+ overrideKernelCheck bool
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func parseOptions(options []string) (*overlayOptions, error) {
|
|
|
|
+ o := &overlayOptions{}
|
|
|
|
+ for _, option := range options {
|
|
|
|
+ key, val, err := parsers.ParseKeyValueOpt(option)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+ key = strings.ToLower(key)
|
|
|
|
+ switch key {
|
|
|
|
+ case "overlay2.override_kernel_check":
|
|
|
|
+ o.overrideKernelCheck, err = strconv.ParseBool(val)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+ default:
|
|
|
|
+ return nil, fmt.Errorf("overlay2: Unknown option %s\n", key)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return o, nil
|
|
|
|
+}
|
|
|
|
+
|
|
func supportsOverlay() error {
|
|
func supportsOverlay() error {
|
|
// We can try to modprobe overlay first before looking at
|
|
// We can try to modprobe overlay first before looking at
|
|
// proc/filesystems for when overlay is supported
|
|
// proc/filesystems for when overlay is supported
|