Merge pull request #3830 from amurzeau/contrib5

overlay: use function to check for overlay-based mounts
This commit is contained in:
Tõnis Tiigi
2023-05-10 21:56:28 -07:00
committed by GitHub
7 changed files with 26 additions and 16 deletions

View File

@@ -45,6 +45,7 @@ import (
"github.com/moby/buildkit/util/contentutil"
"github.com/moby/buildkit/util/iohelper"
"github.com/moby/buildkit/util/leaseutil"
"github.com/moby/buildkit/util/overlay"
"github.com/moby/buildkit/util/winlayers"
digest "github.com/opencontainers/go-digest"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
@@ -2701,7 +2702,7 @@ func isReadOnly(mnt mount.Mount) bool {
hasUpperdir = true
}
}
if mnt.Type == "overlay" {
if overlay.IsOverlayMountType(mnt) {
return !hasUpperdir
}
return false

5
cache/refs.go vendored
View File

@@ -27,6 +27,7 @@ import (
"github.com/moby/buildkit/util/compression"
"github.com/moby/buildkit/util/flightcontrol"
"github.com/moby/buildkit/util/leaseutil"
"github.com/moby/buildkit/util/overlay"
"github.com/moby/buildkit/util/progress"
rootlessmountopts "github.com/moby/buildkit/util/rootless/mountopts"
"github.com/moby/buildkit/util/winlayers"
@@ -1513,7 +1514,7 @@ func (m *readOnlyMounter) Mount() ([]mount.Mount, func() error, error) {
return nil, nil, err
}
for i, m := range mounts {
if m.Type == "overlay" {
if overlay.IsOverlayMountType(m) {
mounts[i].Options = readonlyOverlay(m.Options)
continue
}
@@ -1623,7 +1624,7 @@ func (sm *sharableMountable) Mount() (_ []mount.Mount, _ func() error, retErr er
}()
var isOverlay bool
for _, m := range mounts {
if m.Type == "overlay" {
if overlay.IsOverlayMountType(m) {
isOverlay = true
break
}

View File

@@ -167,8 +167,7 @@ func applierFor(dest Mountable, tryCrossSnapshotLink, userxattr bool) (_ *applie
}
mnt := mnts[0]
switch mnt.Type {
case "overlay":
if overlay.IsOverlayMountType(mnt) {
for _, opt := range mnt.Options {
if strings.HasPrefix(opt, "upperdir=") {
a.root = strings.TrimPrefix(opt, "upperdir=")
@@ -183,9 +182,9 @@ func applierFor(dest Mountable, tryCrossSnapshotLink, userxattr bool) (_ *applie
return nil, errors.Errorf("could not find lowerdir in mount options %v", mnt.Options)
}
a.createWhiteoutDelete = true
case "bind", "rbind":
} else if mnt.Type == "bind" || mnt.Type == "rbind" {
a.root = mnt.Source
default:
} else {
mnter := LocalMounter(dest)
root, err := mnter.Mount()
if err != nil {
@@ -570,10 +569,9 @@ func differFor(lowerMntable, upperMntable Mountable) (_ *differ, rerr error) {
}
if len(upperMnts) == 1 {
switch upperMnts[0].Type {
case "bind", "rbind":
if upperMnts[0].Type == "bind" || upperMnts[0].Type == "rbind" {
d.upperBindSource = upperMnts[0].Source
case "overlay":
} else if overlay.IsOverlayMountType(upperMnts[0]) {
overlayDirs, err := overlay.GetOverlayLayers(upperMnts[0])
if err != nil {
return nil, errors.Wrapf(err, "failed to get overlay layers from mount %+v", upperMnts[0])

View File

@@ -167,6 +167,8 @@ func setRedirectDir(mounts []mount.Mount, redirectDirOption string) (ret []mount
return mounts
}
for _, m := range mounts {
// Replace redirect_dir options, but only for overlay.
// redirect_dir is not supported by fuse-overlayfs.
if m.Type == "overlay" {
var opts []string
for _, o := range m.Options {

View File

@@ -23,6 +23,7 @@ import (
"github.com/containerd/continuity/fs/fstest"
"github.com/moby/buildkit/identity"
"github.com/moby/buildkit/util/leaseutil"
overlayutil "github.com/moby/buildkit/util/overlay"
"github.com/pkg/errors"
"github.com/stretchr/testify/require"
bolt "go.etcd.io/bbolt"
@@ -602,7 +603,7 @@ func pathCallback[T any](ctx context.Context, t *testing.T, sn *mergeSnapshotter
require.Len(t, mounts, 1)
mnt := mounts[0]
if mnt.Type == "overlay" {
if overlayutil.IsOverlayMountType(mnt) {
var upperdir string
var lowerdirs []string
for _, opt := range mnt.Options {

8
util/overlay/overlay.go Normal file
View File

@@ -0,0 +1,8 @@
package overlay
import "github.com/containerd/containerd/mount"
// IsOverlayMountType returns true if the mount type is overlay-based
func IsOverlayMountType(mnt mount.Mount) bool {
return mnt.Type == "overlay"
}

View File

@@ -38,24 +38,23 @@ func GetUpperdir(lower, upper []mount.Mount) (string, error) {
// Get layer directories of lower snapshot
var lowerlayers []string
lowerM := lower[0]
switch lowerM.Type {
case "bind":
if lowerM.Type == "bind" {
// lower snapshot is a bind mount of one layer
lowerlayers = []string{lowerM.Source}
case "overlay":
} else if IsOverlayMountType(lowerM) {
// lower snapshot is an overlay mount of multiple layers
var err error
lowerlayers, err = GetOverlayLayers(lowerM)
if err != nil {
return "", err
}
default:
} else {
return "", errors.Errorf("cannot get layer information from mount option (type = %q)", lowerM.Type)
}
// Get layer directories of upper snapshot
upperM := upper[0]
if upperM.Type != "overlay" {
if !IsOverlayMountType(upperM) {
return "", errors.Errorf("upper snapshot isn't overlay mounted (type = %q)", upperM.Type)
}
upperlayers, err := GetOverlayLayers(upperM)