|  | @@ -25,6 +25,10 @@ import (
 | 
	
		
			
				|  |  |  	"strings"
 | 
	
		
			
				|  |  |  	"sync"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	"github.com/docker/buildx/builder"
 | 
	
		
			
				|  |  | +	"github.com/docker/buildx/util/imagetools"
 | 
	
		
			
				|  |  | +	"github.com/docker/cli/cli/command"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	"github.com/distribution/distribution/v3/uuid"
 | 
	
		
			
				|  |  |  	moby "github.com/docker/docker/api/types"
 | 
	
		
			
				|  |  |  	containerType "github.com/docker/docker/api/types/container"
 | 
	
	
		
			
				|  | @@ -52,6 +56,7 @@ type DryRunKey struct{}
 | 
	
		
			
				|  |  |  type DryRunClient struct {
 | 
	
		
			
				|  |  |  	apiClient client.APIClient
 | 
	
		
			
				|  |  |  	execs     sync.Map
 | 
	
		
			
				|  |  | +	resolver  *imagetools.Resolver
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type execDetails struct {
 | 
	
	
		
			
				|  | @@ -60,11 +65,20 @@ type execDetails struct {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // NewDryRunClient produces a DryRunClient
 | 
	
		
			
				|  |  | -func NewDryRunClient(apiClient client.APIClient) *DryRunClient {
 | 
	
		
			
				|  |  | +func NewDryRunClient(apiClient client.APIClient, cli *command.DockerCli) (*DryRunClient, error) {
 | 
	
		
			
				|  |  | +	b, err := builder.New(cli, builder.WithSkippedValidation())
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return nil, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	configFile, err := b.ImageOpt()
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return nil, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  	return &DryRunClient{
 | 
	
		
			
				|  |  |  		apiClient: apiClient,
 | 
	
		
			
				|  |  |  		execs:     sync.Map{},
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +		resolver:  imagetools.New(configFile),
 | 
	
		
			
				|  |  | +	}, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // All methods and functions which need to be overridden for dry run.
 | 
	
	
		
			
				|  | @@ -129,8 +143,16 @@ func (d *DryRunClient) ImageBuild(ctx context.Context, reader io.Reader, options
 | 
	
		
			
				|  |  |  	return moby.ImageBuildResponse{}, ErrNotImplemented
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +func (d *DryRunClient) ImageInspectWithRaw(ctx context.Context, imageName string) (moby.ImageInspect, []byte, error) {
 | 
	
		
			
				|  |  | +	return moby.ImageInspect{ID: "dryRunId"}, nil, nil
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func (d *DryRunClient) ImagePull(ctx context.Context, ref string, options moby.ImagePullOptions) (io.ReadCloser, error) {
 | 
	
		
			
				|  |  | -	return nil, ErrNotImplemented
 | 
	
		
			
				|  |  | +	if _, _, err := d.resolver.Resolve(ctx, ref); err != nil {
 | 
	
		
			
				|  |  | +		return nil, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	rc := io.NopCloser(strings.NewReader(""))
 | 
	
		
			
				|  |  | +	return rc, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (d *DryRunClient) ImagePush(ctx context.Context, ref string, options moby.ImagePushOptions) (io.ReadCloser, error) {
 | 
	
	
		
			
				|  | @@ -304,10 +326,6 @@ func (d *DryRunClient) ImageImport(ctx context.Context, source moby.ImageImportS
 | 
	
		
			
				|  |  |  	return d.apiClient.ImageImport(ctx, source, ref, options)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (d *DryRunClient) ImageInspectWithRaw(ctx context.Context, imageName string) (moby.ImageInspect, []byte, error) {
 | 
	
		
			
				|  |  | -	return d.apiClient.ImageInspectWithRaw(ctx, imageName)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  func (d *DryRunClient) ImageList(ctx context.Context, options moby.ImageListOptions) ([]moby.ImageSummary, error) {
 | 
	
		
			
				|  |  |  	return d.apiClient.ImageList(ctx, options)
 | 
	
		
			
				|  |  |  }
 |