|
@@ -136,7 +136,16 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
- fsMagic, err := graphdriver.GetFSMagic(home)
|
|
|
+ // Perform feature detection on /var/lib/docker/overlay2 if it's an existing directory.
|
|
|
+ // This covers situations where /var/lib/docker/overlay2 is a mount, and on a different
|
|
|
+ // filesystem than /var/lib/docker.
|
|
|
+ // If the path does not exist, fall back to using /var/lib/docker for feature detection.
|
|
|
+ testdir := home
|
|
|
+ if _, err := os.Stat(testdir); os.IsNotExist(err) {
|
|
|
+ testdir = filepath.Dir(testdir)
|
|
|
+ }
|
|
|
+
|
|
|
+ fsMagic, err := graphdriver.GetFSMagic(testdir)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
@@ -144,9 +153,8 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
|
|
|
backingFs = fsName
|
|
|
}
|
|
|
|
|
|
- // check if they are running over btrfs, aufs, zfs, overlay, or ecryptfs
|
|
|
switch fsMagic {
|
|
|
- case graphdriver.FsMagicAufs, graphdriver.FsMagicZfs, graphdriver.FsMagicOverlay, graphdriver.FsMagicEcryptfs, graphdriver.FsMagicNfsFs:
|
|
|
+ case graphdriver.FsMagicAufs, graphdriver.FsMagicEcryptfs, graphdriver.FsMagicNfsFs, graphdriver.FsMagicOverlay, graphdriver.FsMagicZfs:
|
|
|
logrus.Errorf("'overlay2' is not supported over %s", backingFs)
|
|
|
return nil, graphdriver.ErrIncompatibleFS
|
|
|
case graphdriver.FsMagicBtrfs:
|
|
@@ -165,12 +173,23 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
|
|
|
if opts.overrideKernelCheck {
|
|
|
logrus.Warn("Using pre-4.0.0 kernel for overlay2, mount failures may require kernel update")
|
|
|
} else {
|
|
|
- if err := supportsMultipleLowerDir(filepath.Dir(home)); err != nil {
|
|
|
+ if err := supportsMultipleLowerDir(testdir); err != nil {
|
|
|
logrus.Debugf("Multiple lower dirs not supported: %v", err)
|
|
|
return nil, graphdriver.ErrNotSupported
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ supportsDType, err := fsutils.SupportsDType(testdir)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ if !supportsDType {
|
|
|
+ if !graphdriver.IsInitialized(home) {
|
|
|
+ return nil, overlayutils.ErrDTypeNotSupported("overlay2", backingFs)
|
|
|
+ }
|
|
|
+ // allow running without d_type only for existing setups (#27443)
|
|
|
+ logrus.Warn(overlayutils.ErrDTypeNotSupported("overlay2", backingFs))
|
|
|
+ }
|
|
|
|
|
|
rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps)
|
|
|
if err != nil {
|
|
@@ -185,15 +204,6 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
- supportsDType, err := fsutils.SupportsDType(home)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- if !supportsDType {
|
|
|
- // not a fatal error until v17.12 (#27443)
|
|
|
- logrus.Warn(overlayutils.ErrDTypeNotSupported("overlay2", backingFs))
|
|
|
- }
|
|
|
-
|
|
|
d := &Driver{
|
|
|
home: home,
|
|
|
uidMaps: uidMaps,
|