diff --git a/Dockerfile b/Dockerfile index 2165cda2217a..8620cab4a26c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,3 @@ -# syntax=docker/dockerfile:1 - ARG GO_VERSION=1.25 ARG ALPINE_VERSION=3.23 ARG XX_VERSION=1.7.0 diff --git a/docker-bake.hcl b/docker-bake.hcl index 038e191bd382..e1782008a168 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -147,7 +147,7 @@ target "test" { target "binaries" { inherits = ["_common"] target = "binaries" - output = ["${DESTDIR}/build"] + output = ["type=local,dest=${DESTDIR}/build,mode=delete"] platforms = ["local"] } diff --git a/go.mod b/go.mod index 93d181b719d8..4db00861a375 100644 --- a/go.mod +++ b/go.mod @@ -242,3 +242,5 @@ require ( // restore junctions to have os.ModeSymlink flag set on Windows: https://github.com/docker/buildx/issues/3221 godebug winsymlink=0 + +replace github.com/moby/buildkit => github.com/crazy-max/buildkit v0.7.1-0.20260331085236-23ad71a1d7bc // export-local-mirror diff --git a/go.sum b/go.sum index 3ed616b43b33..082f70eeb4a2 100644 --- a/go.sum +++ b/go.sum @@ -112,8 +112,8 @@ github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUo github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/compose-spec/compose-go/v2 v2.9.1 h1:8UwI+ujNU+9Ffkf/YgAm/qM9/eU7Jn8nHzWG721W4rs= github.com/compose-spec/compose-go/v2 v2.9.1/go.mod h1:Oky9AZGTRB4E+0VbTPZTUu4Kp+oEMMuwZXZtPPVT1iE= -github.com/containerd/cgroups/v3 v3.1.3 h1:eUNflyMddm18+yrDmZPn3jI7C5hJ9ahABE5q6dyLYXQ= -github.com/containerd/cgroups/v3 v3.1.3/go.mod h1:PKZ2AcWmSBsY/tJUVhtS/rluX0b1uq1GmPO1ElCmbOw= +github.com/containerd/cgroups/v3 v3.1.2 h1:OSosXMtkhI6Qove637tg1XgK4q+DhR0mX8Wi8EhrHa4= +github.com/containerd/cgroups/v3 v3.1.2/go.mod h1:PKZ2AcWmSBsY/tJUVhtS/rluX0b1uq1GmPO1ElCmbOw= github.com/containerd/console v1.0.5 h1:R0ymNeydRqH2DmakFNdmjR2k0t7UPuiOV/N/27/qqsc= github.com/containerd/console v1.0.5/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/containerd/containerd/api v1.10.0 h1:5n0oHYVBwN4VhoX9fFykCV9dF1/BvAXeg2F8W6UYq1o= @@ -130,8 +130,8 @@ github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/nydus-snapshotter v0.15.13 h1:z9yCiTPMxVBIZlHxOPinZXhly2MdcIqxk9VXPlHIOJY= -github.com/containerd/nydus-snapshotter v0.15.13/go.mod h1:t95dwCb4I0RE4n1iOk0sJCWosNoACA8daOXmU5A2VHI= +github.com/containerd/nydus-snapshotter v0.15.11 h1:YTdF4rsjFRsfyaIhnWVUSLz8FqJwOyRZ5FhvFjHh7Uc= +github.com/containerd/nydus-snapshotter v0.15.11/go.mod h1:EWRd/QJ0b6UKHAqYgiV5gHlqLC2qq5cQiSlXEdVovrA= github.com/containerd/platforms v1.0.0-rc.2 h1:0SPgaNZPVWGEi4grZdV8VRYQn78y+nm6acgLGv/QzE4= github.com/containerd/platforms v1.0.0-rc.2/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= github.com/containerd/plugin v1.0.0 h1:c8Kf1TNl6+e2TtMHZt+39yAPDbouRH9WAToRjex483Y= @@ -148,6 +148,8 @@ github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSw github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crazy-max/buildkit v0.7.1-0.20260331085236-23ad71a1d7bc h1:2oWGozv1G0Zx1ODikMbN65VEhobiE0JXFDiNCw9ZZ9Q= +github.com/crazy-max/buildkit v0.7.1-0.20260331085236-23ad71a1d7bc/go.mod h1:FPkVzxOlm9cCOudPPY+TKcSarpiUn/1Bi3SSZhZVB9w= github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= @@ -418,8 +420,6 @@ github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4 github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/buildkit v0.29.0-rc1 h1:pEL7RVtmBs2mdNey32sEGsClZ2jx0C7fzyITDCa9ZCU= -github.com/moby/buildkit v0.29.0-rc1/go.mod h1:N+QLSGxzV0p+GC/53SIdSs7ASUDQcdx9QSnyARzizIM= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/go-archive v0.2.0 h1:zg5QDUM2mi0JIM9fdQZWC7U8+2ZfixfTYoHL7rWUcP8= diff --git a/vendor/github.com/moby/buildkit/client/llb/source.go b/vendor/github.com/moby/buildkit/client/llb/source.go index ecc6734ff113..0ffeddace4c0 100644 --- a/vendor/github.com/moby/buildkit/client/llb/source.go +++ b/vendor/github.com/moby/buildkit/client/llb/source.go @@ -398,8 +398,6 @@ func Git(url, fragment string, opts ...GitOption) State { AuthTokenSecret: GitAuthTokenKey, } ref, subdir, ok := strings.Cut(fragment, ":") - subdir = path.Join("/", subdir) - subdir = strings.TrimPrefix(subdir, "/") if ref != "" { GitRef(ref).SetGitOption(gi) } @@ -478,11 +476,6 @@ func Git(url, fragment string, opts ...GitOption) State { addCap(&gi.Constraints, pb.CapSourceGitSkipSubmodules) } - if gi.MTime != "" { - attrs[pb.AttrGitMTime] = gi.MTime - addCap(&gi.Constraints, pb.CapSourceGitMTime) - } - addCap(&gi.Constraints, pb.CapSourceGit) source := NewSource("git://"+id, attrs, gi.Constraints) @@ -510,7 +503,6 @@ type GitInfo struct { Ref string SubDir string SkipSubmodules bool - MTime string } func GitRef(v string) GitOption { @@ -531,20 +523,6 @@ func GitSkipSubmodules() GitOption { }) } -// GitMTimeCommit sets file modification times to the commit timestamp -// of the resolved commit, rather than the checkout time. -func GitMTimeCommit() GitOption { - return GitMTime("commit") -} - -// GitMTime sets the file modification time policy for git sources. -// Valid values are "checkout" (default) and "commit". -func GitMTime(v string) GitOption { - return gitOptionFunc(func(gi *GitInfo) { - gi.MTime = v - }) -} - func KeepGitDir() GitOption { return gitOptionFunc(func(gi *GitInfo) { gi.KeepGitDir = true diff --git a/vendor/github.com/moby/buildkit/client/solve.go b/vendor/github.com/moby/buildkit/client/solve.go index 76fae3b7ebf2..c58e29e7e1c6 100644 --- a/vendor/github.com/moby/buildkit/client/solve.go +++ b/vendor/github.com/moby/buildkit/client/solve.go @@ -5,14 +5,17 @@ import ( "encoding/base64" "encoding/json" "io" + gofs "io/fs" "maps" "os" + "path/filepath" "slices" "strings" "time" "github.com/containerd/containerd/v2/core/content" contentlocal "github.com/containerd/containerd/v2/plugins/content/local" + continuityfs "github.com/containerd/continuity/fs" controlapi "github.com/moby/buildkit/api/services/control" "github.com/moby/buildkit/client/llb" "github.com/moby/buildkit/client/ociindex" @@ -108,6 +111,7 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG if opt.Ref != "" { ref = opt.Ref } + reconcileCtx := ctx eg, ctx := errgroup.WithContext(ctx) statusContext, cancelStatus := context.WithCancelCause(context.Background()) @@ -136,6 +140,37 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG storesToUpdate := []string{} + type localDeleteExport struct { + stageDir string + destDir string + } + var localDeleteExports []localDeleteExport + defer func() { + for _, ex := range localDeleteExports { + _ = os.RemoveAll(ex.stageDir) + } + }() + + if opt.SessionPreInitialized { + for _, ex := range opt.Exports { + if ex.Type != ExporterLocal { + continue + } + mode := filesync.FSSyncDirModeCopy + if ex.Attrs != nil { + mode, err = filesync.ParseFSSyncDirMode(ex.Attrs["mode"]) + if err != nil { + return nil, err + } + } + if mode == filesync.FSSyncDirModeDelete { + // Delete mode stages into a temporary directory and reconciles after + // solve returns, which this preinitialized-session path cannot set up. + return nil, errors.New("local exporter mode=delete is not supported with SessionPreInitialized") + } + } + } + if !opt.SessionPreInitialized { if len(syncedDirs) > 0 { s.Allow(filesync.NewFSSyncProvider(syncedDirs)) @@ -189,7 +224,33 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG if ex.OutputDir == "" { return nil, errors.Errorf("output directory is required for %s exporter", ex.Type) } - syncTargets = append(syncTargets, filesync.WithFSSyncDir(exID, ex.OutputDir)) + if ex.Type == ExporterLocal { + mode := filesync.FSSyncDirModeCopy + if ex.Attrs != nil { + mode, err = filesync.ParseFSSyncDirMode(ex.Attrs["mode"]) + if err != nil { + return nil, err + } + } + if mode == filesync.FSSyncDirModeDelete { + // Delete mode is reconciled after solve returns. The DiffCopy + // stream only guarantees the staged copy, not follow-up delete + // work on the sync target. + stageDir, err := os.MkdirTemp("", "buildkit-local-export-") + if err != nil { + return nil, err + } + localDeleteExports = append(localDeleteExports, localDeleteExport{ + stageDir: stageDir, + destDir: ex.OutputDir, + }) + syncTargets = append(syncTargets, filesync.WithFSSyncDir(exID, stageDir)) + } else { + syncTargets = append(syncTargets, filesync.WithFSSyncDir(exID, ex.OutputDir)) + } + } else { + syncTargets = append(syncTargets, filesync.WithFSSyncDir(exID, ex.OutputDir)) + } } if supportStore { store := ex.OutputStore @@ -382,6 +443,11 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG if err := eg.Wait(); err != nil { return nil, err } + for _, ex := range localDeleteExports { + if err := reconcileLocalDeleteExport(reconcileCtx, ex.stageDir, ex.destDir); err != nil { + return nil, err + } + } // Update index.json of exported cache content store // FIXME(AkihiroSuda): dedupe const definition of cache/remotecache.ExporterResponseManifestDesc = "cache.manifest" if manifestDescJSON := res.ExporterResponse["cache.manifest"]; manifestDescJSON != "" { @@ -423,6 +489,75 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG return res, nil } +func reconcileLocalDeleteExport(ctx context.Context, stageDir, destDir string) error { + if err := os.MkdirAll(destDir, 0o755); err != nil { + return errors.Wrapf(err, "failed to create local export dir %s", destDir) + } + + if err := continuityfs.Changes(ctx, destDir, stageDir, func(kind continuityfs.ChangeKind, p string, _ os.FileInfo, err error) error { + if err != nil { + return err + } + if kind != continuityfs.ChangeKindDelete { + return nil + } + if len(p) > 0 { + p = p[1:] + } + if p == "" { + return nil + } + return os.RemoveAll(filepath.Join(destDir, p)) + }); err != nil { + return errors.WithStack(err) + } + + stageFS, err := fsutil.NewFS(stageDir) + if err != nil { + return err + } + return writeLocalExportFS(ctx, stageFS, destDir) +} + +func writeLocalExportFS(ctx context.Context, src fsutil.FS, dest string) error { + dw, err := fsutil.NewDiskWriter(ctx, dest, fsutil.DiskWriterOpt{ + AsyncDataCb: func(ctx context.Context, p string, wc io.WriteCloser) (retErr error) { + defer func() { + if err := wc.Close(); retErr == nil { + retErr = err + } + }() + + r, err := src.Open(p) + if err != nil { + return err + } + defer r.Close() + + _, err = io.Copy(wc, r) + return err + }, + }) + if err != nil { + return err + } + + if err := src.Walk(ctx, "", func(p string, entry gofs.DirEntry, err error) error { + if err != nil { + return err + } + info, err := entry.Info() + if err != nil { + return err + } + return dw.HandleChange(fsutil.ChangeKindAdd, p, info, nil) + }); err != nil { + return err + } + + return dw.Wait(ctx) +} + func prepareSyncedFiles(def *llb.Definition, localMounts map[string]fsutil.FS) (filesync.StaticDirSource, error) { resetUIDAndGID := func(p string, st *fstypes.Stat) fsutil.MapResult { st.Uid = 0 diff --git a/vendor/github.com/moby/buildkit/frontend/dockerfile/dfgitutil/git_ref.go b/vendor/github.com/moby/buildkit/frontend/dockerfile/dfgitutil/git_ref.go index 26abb16cbc18..a45c9fb7d5bc 100644 --- a/vendor/github.com/moby/buildkit/frontend/dockerfile/dfgitutil/git_ref.go +++ b/vendor/github.com/moby/buildkit/frontend/dockerfile/dfgitutil/git_ref.go @@ -56,9 +56,6 @@ type GitRef struct { // Submodules is true for URL that controls whether to fetch git submodules. Submodules *bool - - // MTime controls file modification time policy: "checkout" (default) or "commit". - MTime string } // ParseGitRef parses a git ref. @@ -185,13 +182,6 @@ func (gf *GitRef) loadQuery(query url.Values) error { } } gf.Submodules = &vv - case "mtime": - switch v[0] { - case "checkout", "commit": - gf.MTime = v[0] - default: - return errors.Errorf("invalid mtime value: %q (must be \"checkout\" or \"commit\")", v[0]) - } default: return errors.Errorf("unexpected query %q", k) } diff --git a/vendor/github.com/moby/buildkit/frontend/dockerui/context.go b/vendor/github.com/moby/buildkit/frontend/dockerui/context.go index 3bd5094f6118..88d68569b4fc 100644 --- a/vendor/github.com/moby/buildkit/frontend/dockerui/context.go +++ b/vendor/github.com/moby/buildkit/frontend/dockerui/context.go @@ -6,7 +6,6 @@ import ( "context" "path/filepath" "regexp" - "slices" "strconv" "github.com/moby/buildkit/client/llb" @@ -74,11 +73,7 @@ func (bc *Client) initContext(ctx context.Context) (*buildContext, error) { if v, err := strconv.ParseBool(opts[keyContextKeepGitDirArg]); err == nil { keepGit = &v } - var extraGitOpts []llb.GitOption - if opts[keySourceDateEpoch] != "" { - extraGitOpts = append(extraGitOpts, llb.GitMTimeCommit()) - } - if st, ok, err := DetectGitContext(opts[localNameContext], keepGit, extraGitOpts...); ok { + if st, ok, err := DetectGitContext(opts[localNameContext], keepGit); ok { if err != nil { return nil, err } @@ -148,15 +143,15 @@ func (bc *Client) initContext(ctx context.Context) (*buildContext, error) { return bctx, nil } -func DetectGitContext(ref string, keepGit *bool, opts ...llb.GitOption) (*llb.State, bool, error) { +func DetectGitContext(ref string, keepGit *bool) (*llb.State, bool, error) { g, isGit, err := dfgitutil.ParseGitRef(ref) if err != nil { return nil, isGit, err } - gitOpts := slices.Concat(opts, []llb.GitOption{ + gitOpts := []llb.GitOption{ llb.GitRef(g.Ref), WithInternalName("load git source " + ref), - }) + } if g.KeepGitDir != nil && *g.KeepGitDir { gitOpts = append(gitOpts, llb.KeepGitDir()) } @@ -172,9 +167,6 @@ func DetectGitContext(ref string, keepGit *bool, opts ...llb.GitOption) (*llb.St if g.Submodules != nil && !*g.Submodules { gitOpts = append(gitOpts, llb.GitSkipSubmodules()) } - if g.MTime != "" { - gitOpts = append(gitOpts, llb.GitMTime(g.MTime)) - } st := llb.Git(g.Remote, "", gitOpts...) return &st, true, nil diff --git a/vendor/github.com/moby/buildkit/session/filesync/diffcopy.go b/vendor/github.com/moby/buildkit/session/filesync/diffcopy.go index 5e8b40b93d94..af0582b655c0 100644 --- a/vendor/github.com/moby/buildkit/session/filesync/diffcopy.go +++ b/vendor/github.com/moby/buildkit/session/filesync/diffcopy.go @@ -8,7 +8,6 @@ import ( "time" "github.com/moby/buildkit/util/bklog" - "github.com/pkg/errors" "github.com/tonistiigi/fsutil" fstypes "github.com/tonistiigi/fsutil/types" diff --git a/vendor/github.com/moby/buildkit/session/filesync/filesync.go b/vendor/github.com/moby/buildkit/session/filesync/filesync.go index 230493f1690f..8213ca94f2a7 100644 --- a/vendor/github.com/moby/buildkit/session/filesync/filesync.go +++ b/vendor/github.com/moby/buildkit/session/filesync/filesync.go @@ -251,6 +251,24 @@ type FSSyncTarget interface { target() *fsSyncTarget } +type FSSyncDirMode string + +const ( + FSSyncDirModeCopy FSSyncDirMode = "copy" + FSSyncDirModeDelete FSSyncDirMode = "delete" +) + +func ParseFSSyncDirMode(v string) (FSSyncDirMode, error) { + switch strings.ToLower(strings.TrimSpace(v)) { + case "", string(FSSyncDirModeCopy): + return FSSyncDirModeCopy, nil + case string(FSSyncDirModeDelete): + return FSSyncDirModeDelete, nil + default: + return "", errors.Errorf("invalid local exporter mode %q", v) + } +} + type fsSyncTarget struct { id int outdir string diff --git a/vendor/github.com/moby/buildkit/solver/pb/attr.go b/vendor/github.com/moby/buildkit/solver/pb/attr.go index 53aa4eafcc97..0db767341bd3 100644 --- a/vendor/github.com/moby/buildkit/solver/pb/attr.go +++ b/vendor/github.com/moby/buildkit/solver/pb/attr.go @@ -8,7 +8,6 @@ const AttrKnownSSHHosts = "git.knownsshhosts" const AttrMountSSHSock = "git.mountsshsock" const AttrGitChecksum = "git.checksum" const AttrGitSkipSubmodules = "git.skipsubmodules" -const AttrGitMTime = "git.mtime" const AttrGitSignatureVerifyPubKey = "git.sig.pubkey" const AttrGitSignatureVerifyRejectExpired = "git.sig.rejectexpired" diff --git a/vendor/github.com/moby/buildkit/solver/pb/caps.go b/vendor/github.com/moby/buildkit/solver/pb/caps.go index d62c5e2c2b8c..d869b9f8152b 100644 --- a/vendor/github.com/moby/buildkit/solver/pb/caps.go +++ b/vendor/github.com/moby/buildkit/solver/pb/caps.go @@ -34,7 +34,6 @@ const ( CapSourceGitChecksum apicaps.CapID = "source.git.checksum" CapSourceGitSkipSubmodules apicaps.CapID = "source.git.skipsubmodules" CapSourceGitSignatureVerify apicaps.CapID = "source.git.signatureverify" - CapSourceGitMTime apicaps.CapID = "source.git.mtime" CapSourceHTTP apicaps.CapID = "source.http" CapSourceHTTPAuth apicaps.CapID = "source.http.auth" @@ -256,12 +255,6 @@ func init() { Status: apicaps.CapStatusExperimental, }) - Caps.Init(apicaps.Cap{ - ID: CapSourceGitMTime, - Enabled: true, - Status: apicaps.CapStatusExperimental, - }) - Caps.Init(apicaps.Cap{ ID: CapSourceHTTP, Enabled: true, diff --git a/vendor/github.com/moby/buildkit/util/gitutil/git_url.go b/vendor/github.com/moby/buildkit/util/gitutil/git_url.go index a549f8d409f0..f06f0e438a8c 100644 --- a/vendor/github.com/moby/buildkit/util/gitutil/git_url.go +++ b/vendor/github.com/moby/buildkit/util/gitutil/git_url.go @@ -2,7 +2,6 @@ package gitutil import ( "net/url" - "path" "regexp" "strings" @@ -73,8 +72,6 @@ func parseOpts(fragment string) *GitURLOpts { return nil } ref, subdir, _ := strings.Cut(fragment, ":") - subdir = path.Join("/", subdir) - subdir = strings.TrimPrefix(subdir, "/") return &GitURLOpts{Ref: ref, Subdir: subdir} } diff --git a/vendor/modules.txt b/vendor/modules.txt index 8fe6d66d33fb..ffebe2c55f13 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -641,7 +641,7 @@ github.com/mitchellh/go-wordwrap # github.com/mitchellh/hashstructure/v2 v2.0.2 ## explicit; go 1.14 github.com/mitchellh/hashstructure/v2 -# github.com/moby/buildkit v0.29.0-rc1 +# github.com/moby/buildkit v0.29.0-rc1 => github.com/crazy-max/buildkit v0.7.1-0.20260331085236-23ad71a1d7bc ## explicit; go 1.25.5 github.com/moby/buildkit/api/services/control github.com/moby/buildkit/api/types @@ -1637,3 +1637,4 @@ sigs.k8s.io/structured-merge-diff/v6/value # sigs.k8s.io/yaml v1.6.0 ## explicit; go 1.22 sigs.k8s.io/yaml +# github.com/moby/buildkit => github.com/crazy-max/buildkit v0.7.1-0.20260331085236-23ad71a1d7bc