dap: make exec shell persistent across the build
Invoking the shell will cause it to persist across the entire build and to re-execute whenever the builder pauses at another location again. This still requires using `exec` to launch the shell. Launching by frame id is also removed since it no longer applies to this version. Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
This commit is contained in:
@@ -1,10 +1,15 @@
|
||||
package build
|
||||
|
||||
import (
|
||||
"cmp"
|
||||
"context"
|
||||
_ "crypto/sha256" // ensure digests can be computed
|
||||
"encoding/json"
|
||||
"io"
|
||||
iofs "io/fs"
|
||||
"path/filepath"
|
||||
"slices"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/moby/buildkit/exporter/containerimage/exptypes"
|
||||
@@ -14,6 +19,7 @@ import (
|
||||
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/tonistiigi/fsutil/types"
|
||||
)
|
||||
|
||||
// NewResultHandle stores a gateway client, gateway reference, and the error from
|
||||
@@ -75,6 +81,40 @@ func (r *ResultHandle) NewContainer(ctx context.Context, cfg *InvokeConfig) (gat
|
||||
return r.gwClient.NewContainer(ctx, req)
|
||||
}
|
||||
|
||||
func (r *ResultHandle) StatFile(ctx context.Context, fpath string, cfg *InvokeConfig) (*types.Stat, error) {
|
||||
containerCfg, err := r.getContainerConfig(cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
candidateMounts := make([]gateway.Mount, 0, len(containerCfg.Mounts))
|
||||
for _, m := range containerCfg.Mounts {
|
||||
if strings.HasPrefix(fpath, m.Dest) {
|
||||
candidateMounts = append(candidateMounts, m)
|
||||
}
|
||||
}
|
||||
if len(candidateMounts) == 0 {
|
||||
return nil, iofs.ErrNotExist
|
||||
}
|
||||
|
||||
slices.SortFunc(candidateMounts, func(a, b gateway.Mount) int {
|
||||
return cmp.Compare(len(a.Dest), len(b.Dest))
|
||||
})
|
||||
|
||||
m := candidateMounts[len(candidateMounts)-1]
|
||||
relpath, err := filepath.Rel(m.Dest, fpath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if m.Ref == nil {
|
||||
return nil, iofs.ErrNotExist
|
||||
}
|
||||
|
||||
req := gateway.StatRequest{Path: filepath.ToSlash(relpath)}
|
||||
return m.Ref.StatFile(ctx, req)
|
||||
}
|
||||
|
||||
func (r *ResultHandle) getContainerConfig(cfg *InvokeConfig) (containerCfg gateway.NewContainerRequest, _ error) {
|
||||
if r.ref != nil && r.solveErr == nil {
|
||||
logrus.Debugf("creating container from successful build")
|
||||
|
||||
Reference in New Issue
Block a user