mirror of
https://github.com/moby/buildkit.git
synced 2026-06-30 19:57:39 +00:00
Merge pull request #3830 from amurzeau/contrib5
overlay: use function to check for overlay-based mounts
This commit is contained in:
3
cache/manager_test.go
vendored
3
cache/manager_test.go
vendored
@@ -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
5
cache/refs.go
vendored
@@ -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
|
||||
}
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
8
util/overlay/overlay.go
Normal 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"
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user